我正在使用一些旧代码,其中所有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();
}
}