一、传播特性的产生
在项目开发中,一般将事务设置在service层,当调用这个service方法时,这个service保证了所有的操作在同一个事务中,所有对数据库的操作要么一起成功,要么一起失败。
如果service方法除了调用DAO,还调用了其他的service方法,如何通过事务控制,保证数据的一致,这个时候就需要事务的传播特性。
二、传播特性种类
事务的传播特性共有7种:
1、PROPAGATION_REQUIRED:支持当前事务,如果不存在就新建一个(默认) ;
2、PROPAGATION_REQUIRES_NEW:开启一个新的事务,如果一个事务已经存在,则将这个存在的事务挂起;
3、PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
4、PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果有事务存在,挂起当前事务;
5、PROPAGATION_MANDATORY:必须运行在一个事务中,如果当前没有事务正在发生,将抛出一个异常;
6、PROPAGATION_NEVER:以非事务方式运行,如果有事务存在,抛出异常;
7、PROPAGATION_NESTED:如果当前正有一个事务在进行中,则该方法应当运行在一个嵌套式事务中。被嵌套的事务可以独立于封装事务进行提交或回滚。如果封装事务不存在,行为就像PROPAGATION_REQUIRES一样。
三、传播特性作用
传播特性主要控制是使用老的事务,还是创建新的事务,或者事务是否运行在上下文中。
四、传播特性的调用
1、注解
示例:
@Transactional(propagation = Propagation.REQUIRED)
public void addStudent(){
。。。。
}
2、AOP配置
示例:
<!-- 配置事务传播特性 -->
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="execute*" propagation="REQUIRED" rollback-for="java.lang.RuntimeException" />
<tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.RuntimeException" />
<tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.RuntimeException" />
<tx:method name="get*" propagation="REQUIRED" read-only="true" />
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor pointcut="execution(* bs.com.service.impl.*.*(..))" advice-ref="transactionAdvice" />
</aop:config>