史上最全:Spring 关于事务传播总结

  • PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务,就加入到这个事务中。这是最常见的选择。
  • PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
  • PROPAGATION_MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常。
  • PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
  • PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
  • PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

@Transactional(propagation=Propagation.REQUIRES_NEW) 会启动一个新事务

@Transactional(propagation=Propagation.REQUIRES) 有事务,直接加入 ,没有事务就产生一个事务

1.私有方法本身是不会存在事务开启和回滚

2.本类调本类有事务的方法,被调用的本类方法不会有自己本身的事务,被调用者会根据调用者的事务行为进行变化

(原因是直接调用本类有事务的方法,没有走代理,所以spring不会管理事务,事务方法相当于调用方法的中代码片断)

3.二个接口类I1,I2中,

I1 有四个方法:

A(事务T) B(事务T) C(事务T_N) D(无事务)

I2 有四个方法:

BB(事务T) CC(事务T_N) DD(无事务)

4.本类调用bean注入自身后,通过bean调用另一个的接口方法时,

A -> bean.B 共同事务,B加入A事务中,无论A还是B抛出异常,都会进行回滚

A -> bean.C A中存在一个事务,B中启一个新的事物,不论是A抛出异常,或者C中抛出异常,谁抛异常谁回滚

A -> bean.D A中存在事务,D中事务进行了传播(相当于A中的代码片断),如果A抛出了异常,那么A中会进行事务回滚,D中如果抛出异常不会影响到A的事务.

D -> bean.B 只有B中有事务,只有B抛出了异常,B中事务才会进行回滚

D -> bean.C 只有B中有事务,B中启一个新的事物,不论是A抛出异常,或者C中抛出异常,谁抛异常谁回滚

D -> bean.D 不存在事务

5.本类调用另一个类的接口方法时,

A -> BB 共同事务,无论是A方法抛出异常还是AA方法,事务T 都会进行回滚

A -> CC A 中存在一个事务,CC 中启动了一个新事务,不论是A抛出异常,或者CC中抛出异常,谁抛异常谁回滚

A -> DD 共同事务,A将事务传播到D,如果A抛出了异常,事务就会回滚

D -> BB BB存在事务,BB抛出异常,那么事务T会进行回滚

D -> CC CC存在事务,CC抛出异常,那么事务T会进行回滚

D -> DD 无事务支持

如果要处理本类调用本类产生事务,需要通过调用代理类去调用其方法,或者手动开启事务。

关于获取代理类,可以直接在当前类注入

@Autowired

private ApplicationContext context;

获取调用其getBean 方法获取代理bean实例。

发布了54 篇原创文章 · 获赞 31 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/u012149894/article/details/82253727
今日推荐