java Spring集成@Transactional回滚许多数据库操作
我的问题很简单,我想回滚调用我的服务方法引起的所有数据库更改我对正确的注释有问题。我不确定应该把@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
作为代理,这一点很重要
# 1 楼答案
在spring特定xml的数据源配置中,检查AUTO_COMMIT是否设置为false