https://blog.csdn.net/bigtree_3721/article/details/53966617.net
所谓事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。Spring支持7种事务传播行为线程
一、PROPAGATION_REQUIRED(加入已有事务)blog
若是当前没有事务,就新建一个事务,若是已经存在一个事务中,加入到这个事务中。这是最多见也是默认的方式。事务
二、PROPAGATION_SUPPORTS(跟随环境)程序
支持当前事务,若是当前没有事务,就以非事务方式执行。方法
三、PROPAGATION_MANDATORY(须要事务)d3
使用当前的事务,若是当前没有事务,就抛出异常。异常
四、PROPAGATION_REQUIRES_NEW(独立事务)vi
新建事务,若是当前存在事务,把当前事务挂起。工作
五、PROPAGATION_NOT_SUPPORTED(非事务方式)
以非事务方式执行操做,若是当前存在事务,就把当前事务挂起。
六、PROPAGATION_NEVER(排除事务)
以非事务方式执行,若是当前存在事务,则抛出异常。
七、PROPAGATION_NESTED(嵌套事务)
若是当前存在事务,则在嵌套事务内执行。若是当前没有事务,则执行与PROPAGATION_REQUIRED相似的操做。
Spring默认的事务传播行为是PROPAGATION_REQUIRED,它适合于绝大多数的状况。假设ServiveX#methodX()都工做在事务环境下(即都被Spring事务加强了),假设程序中存在以下的调用链:Service1#method1()->Service2#method2()->Service3#method3(),那么这3个服务类的3个方法经过Spring的事务传播机制都工做在同一个事务中。
若是在一个ServiceA和a()方法中启动一个线程,在这个新建立的线程中执行ServiceB的事务方法b()。在相同线程中进行相互嵌套调用的事务方法工做于相同的事务中。若是这些相互嵌套调用的方法工做在不一样的线程中,不一样线程下的事务方法工做在独立的事务中。