spring事务是如何传递的
-
spring事务是通过将事务传递给调用链中的各个方法来实现的。当一个方法调用另一个方法时,如果调用者方法已经开启了事务,那么被调用方法将会沿着调用链继续使用同一事务。如果被调用方法没有单独开启事务,则将复用调用者方法的事务。
具体来说,spring事务传递有以下几种方式:
- REQUIRED传播行为:被调用方法会在当前事务下运行。如果当前没有事务存在,就会创建一个新的事务。
- REQUIRES_NEW传播行为:被调用方法会创建一个新的事务,如果当前已经存在事务,则将当前事务挂起。
- SUPPORTS传播行为:被调用方法会尝试在当前事务环境中运行。如果当前没有事务存在,被调用方法会以非事务方式运行。
- NOT_SUPPORTED传播行为:被调用方法会以非事务方式运行,即使当前存在事务,也会将其挂起。
- MANDATORY传播行为:被调用方法要求在一个已存在的事务中运行。如果当前没有事务存在,将抛出异常。
- NEVER传播行为:被调用方法要求在没有事务的环境下运行。如果当前存在事务,则抛出异常。
spring事务的传播行为可以通过@Transactional注解来指定。例如:
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
// 调用methodB
methodB();
}@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
// 事务逻辑
}在上述例子中,methodA被标记为REQUIRED传播行为,而methodB被标记为REQUIRES_NEW传播行为。当methodA调用methodB时,methodB将会在一个全新的事务中运行,而不是复用methodA的事务。
1年前 -
Spring事务的传递是通过TransactionPropagation属性来控制的。事务的传递性是指在一个事务中调用另一个带有事务的方法时,事务是如何传递的。
以下是Spring事务传递的几种常见方案:
-
REQUIRED:如果当前存在事务,则加入该事务中,如果不存在事务,则新建一个事务。这是默认的传播行为。
-
SUPPORTS:如果当前存在事务,则加入该事务中,如果不存在事务,则以非事务方式执行。
-
MANDATORY:如果当前存在事务,则加入该事务中,如果不存在事务,则抛出异常。
-
REQUIRES_NEW:无论当前是否存在事务,都创建一个新的事务。如果存在事务,则挂起当前事务。
-
NOT_SUPPORTED:以非事务方式执行,并且如果当前存在事务,则挂起当前事务。
-
NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
-
NESTED:如果当前存在事务,则在当前事务的内部创建一个嵌套事务。嵌套事务是依赖于当前事务的,外部事务的回滚不会影响到嵌套事务,但是内部事务的回滚会影响到外部事务。
通过设置TransactionPropagation属性,可以灵活地控制事务的传递行为,以满足不同的业务需求。
需要注意的是,在Spring中,事务的传播性只适用于声明式事务,即通过注解或XML配置的方式来管理事务。对于编程式事务,事务的传播性需要手动控制。
1年前 -
-
Spring事务的传递是通过事务的传播行为来实现的。在Spring中,事务可以分为多个层次,当一个事务方法调用另一个事务方法时,事务的传播行为决定了两个方法之间的事务如何进行传递和管理。
在Spring中,事务的传播行为有以下几种:
-
REQUIRED:如果存在一个事务,则支持当前事务。如果没有事务,则创建一个新的事务。这是默认的传播行为。
-
SUPPORTS:如果存在一个事务,支持当前事务。如果没有事务,则非事务地执行。
-
MANDATORY:如果存在一个事务,支持当前事务。如果没有事务,则抛出异常。
-
REQUIRES_NEW:创建一个新的事务,如果存在一个事务,则将当前事务挂起。
-
NOT_SUPPORTED:以非事务方式执行操作,如果存在一个事务,则将当前事务挂起。
-
NEVER:以非事务方式执行操作,如果存在一个事务,则抛出异常。
-
NESTED:如果存在一个事务,则在嵌套事务内执行。如果没有事务,则执行与REQUIRED传播行为类似的操作。
下面以具体的方法调用为例,来说明Spring事务的传递过程:
假设有三个方法:methodA、methodB和methodC,它们都被声明为事务方法。
@Transactional public void methodA(){ //... methodB(); //... } @Transactional public void methodB(){ //... methodC(); //... } @Transactional public void methodC(){ //... }-
如果methodA调用methodB,methodB调用methodC。如果methodA和methodB都在同一个事务中执行(使用REQUIRED传播行为),那么methodC也将在同一个事务中执行。
-
如果methodA不在事务中执行(使用NOT_SUPPORTED传播行为),methodB也不在事务中执行(使用REQUIRES_NEW传播行为),那么methodC将在一个新事务中执行。
这样,Spring通过事务的传播行为来管理事务的传递和隔离,使得事务的管理更加灵活和方便。同时,根据实际需求,可以选择合适的传播行为来控制事务的执行方式。
1年前 -