我的问题很简单,我想回滚由调用我的服务方法引起的所有数据库更改。我有一个正确的注释问题。我并不确定在哪里放@Transactional
,我应该在哪里设置传播到REQUIRES_NEW
或MANDATORY
。我会粘贴一个我写的代码,除了SQLException
被抛出的事实不会回滚db更改。Spring Integration @Transactional回滚很多数据库操作
代码:
@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
回滚一切和voilà。不幸的是,这并不容易。
编辑:重要的是要提到我使用代理CGLIB
。
你声明事务管理器('<豆ID =“txManager” ...')正确的春天配置?请参阅http://static.springsource.org/spring/docs/3.0.x/reference/transaction.html#transaction-claclarative – fasseg
是的,它被声明,我在日志中看到有代理创建。据我所知,代理创建是由@Transactional发起的。我正在使用CGLIB。 – MrKiller21