事务的7中传播特性

一、传播特性的产生

       在项目开发中,一般将事务设置在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一样。

三、传播特性作用

       传播特性主要控制是使用老的事务,还是创建新的事务,或者事务是否运行在上下文中。

扫描二维码关注公众号,回复: 2674710 查看本文章

四、传播特性的调用

       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>  

猜你喜欢

转载自blog.csdn.net/u011861874/article/details/81542000