我的问题很简单,我想要回滚因调用我的服务方法而导致的所有数据库更改。我有正确注释的问题。我不确定将@Transactional
放在哪里,我应该将传播设置为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
代理。
答案 0 :(得分:4)
检查spring特定xml
中的数据源配置中AUTO_COMMIT是否设置为false