spring 不同service事务如何传递
在Spring中,事务管理是基于代理的,默认情况下事务管理器会在一个service类的方法上创建事务边界。如果两个不同的service方法在同一个事务上下文中被调用,一个service的方法回滚会影响另一个service的方法,具体取决于事务的传播级别。
事务传播(Transaction Propagation)定义了当一个事务方法被另一个事务方法调用时该如何进行事务管理。Spring提供了多种事务传播行为,常见的有以下几种:
- PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认的传播行为。
- PROPAGATION_REQUIRES_NEW:总是创建一个新的事务,如果当前存在事务,则挂起当前事务。
- PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,则以非事务方式执行。
- PROPAGATION_NOT_SUPPORTED:总是以非事务方式执行,如果当前存在事务,则挂起当前事务。
- PROPAGATION_NEVER:总是以非事务方式执行,如果当前存在事务,则抛出异常。
- PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,则抛出异常。
- PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务中执行;如果当前没有事务,则创建一个新的事务。
例如,如果一个service方法使用PROPAGATION_REQUIRED
,另一个service方法也使用PROPAGATION_REQUIRED
,并且它们在同一个事务上下文中被调用,那么如果其中一个方法回滚,整个事务都会回滚。相反,如果第二个service方法使用PROPAGATION_REQUIRES_NEW
,它将启动一个新的事务,并且它的回滚不会影响第一个事务。
以下是一个示例代码展示了不同事务传播级别的影响:
@Service
public class ServiceA {@Autowiredprivate ServiceB serviceB;@Transactional(propagation = Propagation.REQUIRED)public void methodA() {// 业务逻辑serviceB.methodB();}
}@Service
public class ServiceB {@Transactional(propagation = Propagation.REQUIRES_NEW)public void methodB() {// 业务逻辑}
}
在上面的示例中,如果ServiceB
的methodB
方法中发生异常并回滚,ServiceA
的methodA
方法不会受到影响,因为methodB
在一个新的事务中执行。但是,如果ServiceB
的methodB
方法使用Propagation.REQUIRED
,methodB
的回滚将会影响到methodA
。
所以,不同service之间的事务是否会相互影响,主要取决于它们使用的事务传播级别。