spring @Transactional 传播机制(参数 propagation )

Posted catoop

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring @Transactional 传播机制(参数 propagation )相关的知识,希望对你有一定的参考价值。

@Transactional 的参数 propagation 是描述当前方法在被其他方法调用时,自己对待事务的立场。

参数
说明
@Transactional(propagation = Propagation.REQUIRED)如果当前不存在事务,子方法就自己开启事务。父方法如果有事务,它就跟随父方法的事务被包裹其中。总之 REQUIRED 就是必须运行在事务中
@Transactional(propagation = Propagation.SUPPORTS)如果当前存在了事务,它就也被包裹运行在这个事务中。如果父方法没有开启事务,它就以无事务运行
@Transactional(propagation = Propagation.MANDATORY)要求当前必须存在事务,否则这个子方法就抛出异常 IllegalTransactionStateException
@Transactional(propagation = Propagation.REQUIRES_NEW)不管当前有没有事务,都不在那个事务中运行,自己一定会单独开启一个独立的事务运行
@Transactional(propagation = Propagation.NOT_SUPPORTED)如果当前已经存在了事务,则会挂起这个事务。子方法它坚决不在事务中运行
@Transactional(propagation = Propagation.NEVER)和 Propagation.MANDATORY 相反,子方法要求当前不能存在事务。否则它就抛出异常 IllegalTransactionStateException
@Transactional(propagation = Propagation.NESTED)如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与 PROPAGATION_REQUIRED 类似的操作

特别提醒:
1、应避免两个事务方法之间使用 this 调用(也就是本类内直接调用),如果你确实有本类内调用的需求,请使用 SpringContextUtils.getBean(XxxService.class) 等类似方法先获得当前类的实例后,在用获得的实例调用方法。
2、使用 @Async 注解的方法,也不要使用类内 this 调用,同样会出现不生效或其他未知问题,类内调用的参考方式同第1点。
3、对同一个方法,分别尝试使用 MANDATORYNEVER,可以验证这个方法的事务情况,因为这俩的作用是互斥的。

(END)

以上是关于spring @Transactional 传播机制(参数 propagation )的主要内容,如果未能解决你的问题,请参考以下文章

Spring数据:@Transactional和传播

spring @Transactional 传播机制(参数 propagation )

Spring声明式事务@Transactional 详解,事务隔离级别和传播行为

Spring Boot事务和事务传播机制

Spring Boot事务和事务传播机制

Spring 之注解事务 @Transactional