1.事务的隔离级别
REQUIRED:如果存在一个事务,则在当前事务中执行,如果没有存在一个事务,在需要开启一个事务。
SUPPORTS:如果存在一个事务,则在当前事务中执行,如果没有存在一个事务,则不在事务中执行。
MANDATORY(强制性mandatory):如果存在一个事务,则在当前事务中执行,如果没有存在一个事务,则抛出异常。
REQUIRES_NEW:总是开启一个事务,如果存在一个事务,则把这个事务挂起。在开启的新事务中执行。
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常
PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作
注:
1.对于上面说的,都是在方法中。如下面方法:
managePersonRxTd(id){
deletePerson(id)
updateAdd(id)
}
如果是deletePerson方法配置的为REQUIRED,如果managePersonRxTd方法存在事务,则deletePerson在managePersonRxTd的事务中运行。
否则deletePerson在自己的事务中运行。
2.事务都是针对方法的,但是spring声明式事务是配置到类的,也就是那些类参与事务。如下面的配置,aop:config是配置参与事务的类
3.事务是一个整体。
4.一般是有嵌套事务的
<bean id="cmsTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="xcmDataSource" />
</property>
</bean>
<aop:config>
<aop:pointcut id="cmsManagerServiceMethod"
expression="execution(* com.xcm.cms.service..*Service*.*(..))" />
<aop:advisor advice-ref="possTxAdvice" pointcut-ref="cmsManagerServiceMethod"/>
</aop:config>
<tx:advice id="possTxAdvice" transaction-manager="cmsTransactionManager">
<tx:attributes>
<tx:method name="*" propagation="SUPPORTS" rollback-for="com.common.item.base.exception.AppException" />
<tx:method name="insert*" propagation="REQUIRED" rollback-for="com.common.item.base.exception.AppException" />
<tx:method name="create*" propagation="REQUIRED" rollback-for="com.common.item.base.exception.AppException" />
<tx:method name="delete*" propagation="REQUIRED" rollback-for="com.common.item.base.exception.AppException" />
<tx:method name="update*" propagation="REQUIRED" rollback-for="com.common.item.base.exception.AppException" />
<tx:method name="*SpTx" propagation="SUPPORTS" rollback-for="com.common.item.baseexception.AppException" />
<tx:method name="*NsTx" propagation="NOT_SUPPORTED" />
<tx:method name="*RnTx" propagation="REQUIRES_NEW" rollback-for="com.common.item.base.exception.AppException" />
</tx:attributes>
</tx:advice>