事务传播行为是指当一个事务方法被另一个事务方法调用时,这个事务方法应如何运行的行为。在Spring框架中,事务传播行为是通过TransactionDefinition
接口定义的,并包含七种不同的传播行为,这些行为决定了事务方法之间的调用关系和事务边界。具体来说,这七种传播行为分别是:
PROPAGATION_REQUIRED:如果当前没有事务,则创建一个新的事务;如果当前已经存在事务,则加入该事务。这是默认的传播行为。
-
方法A(没有事务)调用方法B(REQUIRED):创建一个事务。
-
方法A(REQUIRED)调用方法B(REQUIRED):共同使用方法A的事务。
PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,则以非事务方式执行。
-
方法A(没有事务)调用方法B(SUPPORTS):不使用事务。
-
方法A(REQUIRED)调用方法B(SUPPORTS):共同使用方法A的事务。
PROPAGATION_MANDATORY:使用当前的事务,如果当前没有事务,则抛出异常。
-
方法A(没有事务)调用方法B(MANDATORY):抛出异常。
-
方法A(REQUIRED)调用方法B(MANDATORY):共同使用方法A的事务。
PROPAGATION_REQUIRES_NEW:创建一个新的事务,并且暂停当前事务(如果存在)。
-
方法A(没有事务)调用方法B(REQUIRES_NEW):方法B会开启它自己的新事务并执行,而方法A会在没有事务的情况下继续执行。
-
方法A(REQUIRED)调用方法B(REQUIRES_NEW):方法A使用A事务,方法B会开启它自己的新事务,并不会加入到A的事务中。即这两个事务不会嵌套。
PROPAGATION_NOT_SUPPORTED:以非事务方式执行,如果当前有事务,则将其挂起。
-
方法A(没有事务)调用方法B(NOT_SUPPORTED):不使用事务。
-
方法A(REQUIRED)调用方法B(NOT_SUPPORTED):方法A的事务会被暂时搁置(挂起),方法B将在没有事务的环境下运行。如果在方法B中发生了异常,方法A的事务不会被回滚,因为方法B是在非事务状态下运行的。
PROPAGATION_NEVER:以非事务方式执行,如果当前有事务,则抛出异常。
-
方法A(没有事务)调用方法B(NEVER):不使用事务。
-
方法A(REQUIRED)调用方法B(NEVER):抛出异常。
PROPAGATION_NESTED:如果当前有事务,则在嵌套事务内执行。如果当前没有事务,则与PROPAGATION_REQUIRED类似。
-
方法A(没有事务)调用方法B(NESTED):A不使用事务,B会开启一个事务。
-
方法A(REQUIRED)调用方法B(NESTED):A事务中嵌套一个B事务。