在SpringBoot中,事务传播属性控制着在有事务的方法中调用另一个方法时,如何处理事务。以下是三种常见的事务传播属性及其应用场景:
- REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
- REQUIRES\_NEW:创建一个新的事务,如果当前存在事务,则挂起当前事务。
- NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则执行与REQUIRED属性相同的操作。
示例代码:
@Service
public class MyService {
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
// 做一些数据库操作
methodB();
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
// 做一些数据库操作
}
@Transactional(propagation = Propagation.NESTED)
public void methodC() {
// 做一些数据库操作
}
}
在这个例子中,methodA
使用REQUIRED传播属性,这意味着它将在自己的事务中运行,并且如果methodB
或methodC
调用失败,methodA
中的操作也会回滚。methodB
使用REQUIRES\_NEW传播属性,这意味着它会创建一个新的事务,与methodA
的事务相互独立,互不影响。methodC
使用NESTED传播属性,如果methodA
的事务失败回滚,methodC
内的操作不会回滚,只有methodC
内的操作失败才会引起回滚。