- 将调用方法和被调用方法分开,分别使用 @Transactional 注解来管理事务。
推荐这个方法\color{red}{推荐这个方法}推荐这个方法
@Service
@Transactional
public class MyService {
@Autowired
private MyRepository myRepository;
public void foo() {
// 在此调用 bar 方法,事务将自动传播
bar();
}
public void bar() {
// 这里是被调用的方法,也添加 @Transactional 注解来管理事务
myRepository.save(new MyEntity());
}
}
复制代码
- 使用 AspectJ 的方式,在同一个类中通过调用代理对象的方式来保证事务生效。
需要注意的是,使用 AopContext.currentProxy() 需要开启 Spring 的 AspectJ 支持,
@Service
@Transactional
public class MyService {
@Autowired
private MyRepository myRepository;
public void foo() {
// 在此调用 bar 方法,事务将生效
((MyService) AopContext.currentProxy()).bar();
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
private void bar() {
// 这里是被调用的方法,使用 REQUIRES_NEW 传播行为开启一个新的事务
myRepository.save(new MyEntity());
}
}
复制代码