我正在使用一些旧代码,其中所有Spring DAO均使用@Transactional批注进行批注。
现在,我有一个业务需求,我需要在服务层中调用两个不同的DAO,并在任何时候失败的情况下回滚事务。

我如何在Spring 5中实现这一点而不从DAO中删除@Transactional批注,而仍然在服务层中使用它们。我认为下面的代码不起作用,因为每个DAO中的事务都是彼此独立的。

提前谢谢了。

@Transactional
public FooDao {
}

@Transactional
public BarDao {
}


@Transactional
public TestServiceImple implements TestService {
  fooDao.action1();
  barDao.action2();
}

最佳答案

@Transactional批注的默认propagation类型为Propagation.REQUIRED



  支持当前事务,如果不存在则创建一个新事务。



@Transactional批注的默认rollback行为如下



  默认情况下,事务将在RuntimeException上回滚,并且
  错误,但不是检查的异常(业务异常)。


这两个默认配置将确保在服务层的任何RuntimeException /自定义回滚配置中,fooDao.action1()中的barDao.action2()TestServiceImple都可以与相同的txn和回滚一起使用,前提是这两个方法是从同一服务调用的用@Transactional注释的方法。



 @Transactional
 public TestServiceImple implements TestService {

     public void callDaoMethods(){
      fooDao.action1();
      barDao.action2();
     }

 }


要么

public TestServiceImple implements TestService {

 @Transactional
 public void callDaoMethods(){
   fooDao.action1();
   barDao.action2();
 }
}

08-05 03:38
查看更多