-
Spring根蒂根基系列——事务Transaction
添加时间:2013-6-11 点击量:在spring的事务经管高层抽象层中首要包含3个借口:TransactionDefinition,PlatformTransactionManager,TransactionStatus
TransactionDefinition用于描述隔离级别、超不时候、是否为只读事务和事务传播规矩
TransactionStatus代表一个事务的具体运行状况、以及保存点
PlatformTransactionManager一个高层次的接口,包含3个办法commit、rollback和getTramsaction
事务传播级别:
PROPAGATION_REQUIRED--支撑当前事务,若是当前没有事务,就新建一个事务。这是最常见的选择。实用于save、、等操纵
PROPAGATION_SUPPORTS--支撑当前事务,若是当前没有事务,就以非事务体式格式履行。一般读db的操纵可是应用此体式格式,同时将事物设置为ReadOnly。
PROPAGATION_MANDATORY--支撑当前事务,若是当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,若是当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务体式格式履行操纵,若是当前存在事务,就把当前事务挂起。实用于优先级别很高的办法。
PROPAGATION_NEVER--以非事务体式格式履行,若是当前存在事务,则抛出异常。
PROPAGATION_NESTED--若是当前存在事务,则在嵌套事务内履行。若是当前没有事务,则进行与PROPAGATION_REQUIRED类似的操纵。三种事务经管体式格式:编程式事务经管、应用xml设备声明式事务、应用注解设备声明式事务
1.编程式事务经管
略
2.应用xml设备声明式事务
事务属性信息设备规矩
<!-- 传播行动,隔离级别(可选),是否为只读(可选),产生这些异常时回滚(可选),产生这些异常时照样提交(可选)-->
<prop>PROPAGATION,ISOLATION,readOnly,_Exception,+Exception</prop>
第一种:也是我们最常用的办法了,它实用于你的库表斗劲少的景象下。
<bean id=fundServiceDAOProxy
class=org.springframework.transaction.interceptor.TransactionProxyFactoryBean>
<!-- 设备事务经管器 -->
<property name=transactionManager>
<ref bean=transactionManager />
</property>
<!-- 此属性指定目标类本省是否是的对象,若是目标类没有实现任何类,就设为true代表本身 -->
<property name=proxyTargetClass>
<value>false</value>
</property>
<!-- 目标实现的接口 -->
<property name=proxyInterfaces>
<value>com.jack.fund.service.IFundService</value>
</property>
<!-- 目标bean -->
<property name=target>
<ref bean=fundService />
</property>
<!-- 设备事务属性 -->
<property name=transactionAttributes>
<props>
<prop key=>PROPAGATION_REQUIRED</prop>
<prop key=add>PROPAGATION_REQUIRED</prop>
<prop key=>PROPAGATION_REQUIRED</prop>
<prop key=save>PROPAGATION_REQUIRED</prop>
<prop key=find>PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>以下可能还有其他的xxxServiceDAOProxy.大师可以看出针对每一个功能模块设备一个营业办事。若是模块多鬼话,就显得代码有点多了,发明他们只是稍微一点不一样。这时我们就应当想到持续的思惟。用第二种办法。
第二种:设备声明式事务的办法如下。这种景象合适相对斗劲多的模块时应用。
<!-- 哄骗持续的思惟简化设备,要把abstract=true -->
<bean id=transactionBase
class=org.springframework.transaction.interceptor.TransactionProxyFactoryBean
lazy-init=true abstract=true>
<!-- 设备事务经管器 -->
<property name=transactionManager>
<ref bean=transactionManager />
</property>
<!-- 设备事务属性 -->
<property name=transactionAttributes>
<props>
<prop key=>PROPAGATION_REQUIRED</prop>
<prop key=add>PROPAGATION_REQUIRED</prop>
<prop key=>PROPAGATION_REQUIRED</prop>
<prop key=save>PROPAGATION_REQUIRED</prop>
<prop key=find>PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>而具体的模块可以简单的如许设备。只要指明它的parent(父类)就可以了。父类一般把abstract=true,因为在容器加载的时辰不须要初始化,比及用的时辰再有它的子类调用的时辰,再去初始化。
<bean id=fundServiceDAOProxy parent=transactionBase >
<property name=target>
<ref bean=fundService />
</property>
</bean>如许设备的话,若是有多个像fundService如许模块时,可以少些很多反复的代码。
第三种:设备声明式事务的办法如下。首要哄骗BeanNameAutoProxyCreator主动创建事务
<bean id=transactionInterceptor
class=org.springframework.transaction.interceptor.TransactionInterceptor>
<property name=transactionManager>
<ref bean=transactionManager />
</property>
<!-- 设备事务属性 -->
<property name=transactionAttributes>
<props>
<prop key=>PROPAGATION_REQUIRED</prop>
<prop key=add>PROPAGATION_REQUIRED</prop>
<prop key=>PROPAGATION_REQUIRED</prop>
<prop key=save>PROPAGATION_REQUIRED</prop>
<prop key=find>PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean
class=org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator>
<property name=beanNames>
<list>
<value>fundService</value>
</list>
</property>
<property name=interceptorNames>
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>这种办法首要哄骗了阻碍器的道理。
前三种办法一般都必须指定具体的模块bean.若是模块过多话,比如一个大型的网站一般有几十个模块。我们就得推敲用第四种的设备体式格式了。主动创建事务的体式格式了。第四种:设备声明式事务的办法如下。
<bean id=transactionInterceptor
class=org.springframework.transaction.interceptor.TransactionInterceptor>
<property name=transactionManager>
<ref bean=transactionManager />
</property>
<!-- 主动 -->
<bean id=autoproxy
class=org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator>
<!-- 可所以Service或DAO层(好是针对营业层Service) -->
<property name=beanNames>
<list>
<value>Service</value>
</list>
</property>
<property name=interceptorNames>
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>主动还有一种用法就是连络正规表达式和advice应用。
<bean id=transactionInterceptor
class=org.springframework.transaction.interceptor.TransactionInterceptor>
<property name=transactionManager>
<ref bean=transactionManager />
</property>
<bean id=autoProxyCreator
class=org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator />
<bean id=regexpMethodPointcutAdvisor
class=org.springframework.aop.support.RegexpMethodPointcutAdvisor>
<property name=advice>
<ref bean=transactionInterceptor />
</property>
<property name=pattern>
<value>.</value>
</property>
</bean>这个办法可以针对具体的模块进行阻碍并进行事务处理惩罚。
在你的实际项目中,你可以按照你的景象选用不合的办法。具体:http://www.cnblogs.com/rushoooooo/archive/2011/08/28/2155960.html
3.应用注解设备声明式事务 @Transaction
注解本身具有一些广泛应用的默认属性,所以往往只加一个@Transaction就可以了
@Transaction注解属性申明
value:可以绑定到不合的事务经管器上
propagation:事务传播行动
isolation:事务隔离级别
readOnly:是否为只读
timeout:超不时候
rollbackFor:一组异常类,碰到时进行回滚,类型为Class<? extemds Tjrpwab;e>[],默认为{}
rollbackForClassName:一组异常类,碰到时进行回滚,类型为String[],默认为{}
noRollbackFor:一组异常类,碰到时不回滚,类型为Class<? extemds Tjrpwab;e>[],默认为{}
noRollbackForClassName:一组异常类,碰到时不回滚,类型为String[],默认为{}
我们永远不要期待别人的拯救,只有自己才能升华自己。自己已准备好了多少容量,方能吸引对等的人与我们相遇,否则再美好的人出现、再动人的事情降临身边,我们也没有能量去理解与珍惜,终将擦肩而过。—— 姚谦《品味》
