方法A中调用了事务方法B,事务传播机制是作用于被调用方法的,也就是B方法
方法B定义的事务类型 | 解释 | A方法有事务时 | A方法无事务 |
@Transactional(propagation = Propagation.REQUIRED) | 如果当前存在事务,那么就加入这个事务,不存在就新建一个事务 | B和A事务合并成一个事务,当事务B异常回滚时,A方法也被回滚,因为是同一个事务,反之亦然 | B新建一个事务 |
@Transactional(propagation = Propagation.SUPPORTS) | 如果当前有事务,加入事务,如果没有则不使用事务 | B加入到A事务中,即是同一事务,当B事务异常回滚时,A事务也会回滚,反之亦然 | B无事务 |
@Transactional(propagation = Propagation.NOT_SUPPORTED) | 表示不支持事务,如果有事务也不加入事务,没有事务以非事务运行 | 挂起A事务,B以无事务方式执行 (事务挂起理解:方法A调用方法B,方法A打开的 Transaction将挂起,方法B中任何数据库操作,都不在该Transaction的管理之下。 | B无事务 |
@Transactional(propagation = Propagation.REQUIRES_NEW) | 不管是否存在事务,都以最新的事务执行,执行完再执行旧的事务 | B新建一个事务,和A事务无关,互不影响 | B新建一个事务 |
@Transactional(propagation = Propagation.MANDATORY) | 必须在一个事务中执行,如果没有事务,则抛出异常 | B加入到A事务中,即是同一事务,当B事务异常回滚时,A事务也会回滚,反之亦然 | B抛异常 |
@Transactional(propagation = Propagation.NEVER) | 以非事务的方式执行,如果存在事务异常 | B抛异常 | B无事务 |
@Transactional(propagation = Propagation.NESTED) | 如果调用者不存在事务,那么被调用者自己创建事务,这种情况和REQUIRE一样。如果调用者存在事务,那么被调用者就在调用者的事务里嵌套一个事务,称为嵌套事务 | B新建一个A的子事务,A异常影响B,B异常不影响A | B新建一个事务 |