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、对同一个方法,分别尝试使用MANDATORY
和NEVER
,可以验证这个方法的事务情况,因为这俩的作用是互斥的。
(END)
以上是关于spring @Transactional 传播机制(参数 propagation )的主要内容,如果未能解决你的问题,请参考以下文章
spring @Transactional 传播机制(参数 propagation )