我的问题很简单,我想回滚所有由调用我的服务方法引起的数据库更改。我在正确注释方面遇到了问题。我不太确定在哪里放置 @Transactional
以及我应该在哪里将 Propagation 设置为 REQUIRES_NEW
或 MANDATORY
。我将粘贴我编写的代码,除了抛出 SQLException
之外不会回滚数据库更改。
代码:
@Service
public class SwapInsertService {
@Autowired
MyDao myDao;
@Transactional(propagation = Propagation.REQURIES_NEW, rollbackFor = SQLException.class)
public void insertToManyTables(MyData data) throws SQLException {
insertToSpecificTables(data);
myDao.insertTwo(data);
}
@Transactional(propagation = Propagation.MANDATORY)
public void insertToSpecificTables(MyData data) throws SQLException {
myDao.insertOne(data);
}
}
@Repository
public class MyDaoImpl implements MyDao {
@Transactional(propagation = Propagation.MANDATORY)
public void insertOne(MyData data) throws SQLException {
// INSERT
}
@Transactional(propagation = Propagation.MANDATORY)
public void insertTwo(MyData data) throws SQLException {
// throws SQLException
}
}
让我们假设 insertTwo
抛出 SQLException
。我想回滚所有以前的插入。 我做错了什么?
我的理解:
Propagation.REQURIES_NEW
创建新事务。
Propagation.MANDATORY
支持当前事务。
insertTwo
抛出错误,insertToManyTables
回滚一切,瞧。不幸的是,这并不容易。
编辑:重要的是要提到我正在使用 CGLIB
作为代理。
最佳答案
检查spring specific xml中数据源配置中AUTO_COMMIT是否设置为false
关于java - 许多数据库操作的Spring Integration @Transactional回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12516654/