事务的传播性一般用在事务嵌套的场景,比如一个事务方法里面调用了另外一个事务方法,那么两个方法是各自作为独立的方法提交还是内层的事务合并到外层的事务一起提交,这就是需要事务传播机制的配置来确定怎么样执行。
常用的事务传播机制如下:
PROPAGATION_REQUIRED(propagation required)
Spring默认的传播机制,如果外层有事务,则当前事务加入到外层事务,一块提交,一块回滚。如果外层没有事务,新建一个事务执行PROPAGATION_REQUES_NEW(reques new)
该事务传播机制是每次都会新开启一个事务,同时把外层事务挂起,当当前事务执行完毕,恢复上层事务的执行。如果外层没有事务,执行当前新开启的事务即可PROPAGATION_SUPPORT(support)
如果外层有事务,则加入外层事务,如果外层没有事务,则直接使用非事务方式执行。完全依赖外层的事务PROPAGATION_NOT_SUPPORT(not support)
该传播机制不支持事务,如果外层存在事务则挂起,执行完当前代码,则恢复外层事务,无论是否异常都不会回滚当前的代码PROPAGATION_NEVER(never)
该传播机制不支持外层事务,即如果外层有事务就抛出异常PROPAGATION_MANDATORY(mandatory)
与NEVER相反,如果外层没有事务,则抛出异常PROPAGATION_NESTED(nested)
该传播机制的特点是可以保存状态保存点,当前事务回滚到某一个点,从而避免所有的嵌套事务都回滚,即各自回滚各自的,如果子事务没有把异常吃掉,基本还是会引起全部回滚的。
