事务传播行为
-
事务管理员
-
事务协调员
-
事务传播行为:描述的是事务协调员对事务管理员所携带事务的处理态度
就是事务协调员金的事务和事务管理员的事务的关系,也就是事务协调员对事务管理员所带的事务的一个态度
-
REQUIRED
:如果事务管理员开启了一个事务,那么如果事务协调员就会加入这个事务,所以他们两个都是用同一个事务都是T1;如果事务管理员没有开事务,那么事务协调员就会直接新建一个事务 -
REQUIRES NEW:事务管理员不管开启还是没有开启一个事务,事务协调员都会再新建一个事务
-
SUPPORTS
:如果事务管理员原来有事务,那么事务协调员就会加入这个事务;如果事务管理员原来没有事务,那么事务协调员不会加入,不要事务了 -
NOT SUPPORTED:原来事务管理员来的时候有没有事务,事务协调员都不会有事务
-
MANDATORY:必须有事务,事务管理员来的时候带的有事务,事务协调员就会加入这个事务,如果事务管理员来的时候没有事务,那么就会报错
-
NEVER:不需要带的有事务,事务管理员来的时候如果带了事务,就会出现错误;如果不带事务的话,事务协调员也不会有事务
-
NESTED:相对于回滚到到之前设置的回滚点
applicationContext.xml的tx配置
<!-- TX格式 -->
<!-- TX格式 -->
<!-- TX格式 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--定义事务管理的通知类-->
<tx:advice id="txAdvice" transaction-manager="txManager">
<!--定义控制的事务-->
<tx:attributes>
<!-- 所有的操作全部都加读写事务-->
<tx:method name="*" read-only="false"/>
<!-- get开头的所有操作全部都加只读事务-->
<tx:method name="get*" read-only="true"/>
<!--find开头的所有操作全部都加只读事务-->
<tx:method name="find*" read-only="true"/>
<!-- 声明其他的事务操作-->
<tx:method name="a" read-only="false" propagation="REQUIRED"/>
<tx:method name="b" read-only="false" propagation="NEVER"/>
<tx:method
name="transfer"
read-only="false"
timeout="-1"
isolation="DEFAULT"
no-rollback-for=""
rollback-for=""
propagation="REQUIRED"
/>
<!--<tx:method name="transfer" read-only="false"/>-->
</tx:attributes>
</tx:advice>
<aop:config>
<!-- com.yy.service中所有以service结尾的接口,中的所有方法,
即监控接口中所有的方法,对业务层进行精准锁定,就不会出现问题了-->
<aop:pointcut id="pt" expression="execution(* com.itheima.service.*Service.*(..))"/>
<aop:pointcut id="pt2" expression="execution(* com.itheima.dao.*.b(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt2"/>
</aop:config>