7种事务的传播特性
Propagation.REQUIRED
方法被调用时自动开启事务,在事务范围内使用则使用同一个事务,如果当前线程中已经存在事务, 方法调用会加入此事务, 如果当前没有事务,就新建一个事务,(默认事务传播性是REQUIRED)
Propagation.REQUIRES_NEW
无论何时自身都会开启事务,这个事务不依赖于外部事务,它拥有自己的隔离范围,自己的锁,等等。当内部事务开始执行时,外部事务将被挂起,内部事务结束时,外部事务将继续执行。
Propagation.SUPPORTS
自身不会开启事务,在事务范围内使用挂起事务,运行完毕不使用事务
Propagation.NOT_SUPPORTED
自身不会开启事务,在事务范围内使用挂起事务,运行完毕恢复事务
Propagation.MANDATORY
自身不会开启事务,必须在事务环境使用否则报错
Propagation.NEVER
自身不会开启事务,在事务范围内使用抛出异常
Propagation.NESTED
如果当前存在事务,则在嵌套的事务中执行,如果没有则按照TransactionDefinition.PROPAGATION_REQUIRED 属性执行。可以认为是已经存在事务的一个真正的子事务。嵌套事务开始执行时,它将取得一个 save point。如果这个嵌套事务失败,我们将回滚到此save point。嵌套事务是外部事务的一部分,只有外部事务结束后它才会被提交。
Propagation.REQUIRES_NEW和Propagation.NESTED 的最大区别在于,Propagation.REQUIRES_NEW完全是一个新的事务,而 Propagation.NESTED 则是外部事务的子事务。如果外部事务 commit,嵌套事务也会被 commit,这个规则同样适用于rollback。