Spring事务的七种事务传播行为

在TransactionDefinition接口中定义了七种事务传播行为

spring使用AOP来支持声明式事务,会根据事务属性,自动在方法调用之前决定是否开启一个事务,并在方法执行之后决定事务提交或回滚事务

 

1. PROPAGATION_REQUIRED 

如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。

(该属性标注的方法单独运行,也是事务方法,也可加入到别的事务方法里去)

 

2. PROPAGATION_SUPPORTS 

如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。

(该属性标注的方法单独运行,为非事务方法,只有加入到别的事务方法里去,才为事务方法)

 

3. PROPAGATION_MANDATORY

如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常

(该属性标注的方法单独运行,会抛异常,只能加入到别的事务方法里去)

 

4. PROPAGATION_REQUIRES_NEW 

总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。

(该属性标注的方法单独运行,为事务方法,被别的事务方法调用,则挂起别的事务方法,自己开启一个新的事务,提交后挂起的方法恢复执行)

(外层事务和内层事务互不干扰,外层事务失败回滚,内层事务也不会回滚)

 

5. PROPAGATION_NOT_SUPPORTED 

总是非事务地执行,并挂起任何存在的事务

(该属性标注的方法单独运行,为非事务方法,被别的事务方法调用,则挂起别的事务方法,以非事务执行完后,恢复挂起的事务方法)

 

6. PROPAGATION_NEVER 

总是非事务地执行,如果存在一个活动事务,则抛出异常 

(该属性标注的方法单独运行,为非事务方法,被别的事务方法调用,则抛异常)

 

7. PROPAGATION_NESTED

如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行 

(该属性标注的方法单独运行,开启新的事务方法,被别的事务方法调用,则先保存当前的操作状态后执行内层事务,若内层事务失败回滚则回到保存的这个状态。)

嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。

 

posted @ 2018-08-23 14:46  风栖林木  阅读(472)  评论(0编辑  收藏  举报