我的問題很簡單,我想回滾由調用我的服務方法引起的所有數據庫更改。我有一個正確的註釋問題。我並不確定在哪裏放@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