我有一個Spring管理的服務方法來管理數據庫插入。它包含多個插入語句。爲什麼事務回滾RuntimeException但不SQLException
@Transactional
public void insertObservation(ObservationWithData ob) throws SQLException
{
observationDao.insertObservation(ob.getObservation());
// aop pointcut inserted here in unit test
dataDao.insertData(ob.getData());
}
我有兩個單元測試,在調用第二個插入之前拋出異常。如果該異常是RuntimeException,則該事務將回滾。如果異常是SQLException,則第一次插入將被保留。
我很困惑。誰能告訴我爲什麼事務不會在SQLException上回滾?任何人都可以提供一個建議如何管理這個?我可以捕獲SQLException並拋出一個RuntimeException,但這看起來很奇怪。
根據skaffman的回答和Nathan的提示,我已經捕獲了DAO層的所有SQLException,並使用Spring的SQLExceptionTranslator將它們轉換爲未檢查的DataAccessExceptions。這篇春季論壇帖子,http://forum.springsource.org/showthread.php?63549-Conceptual-context-information,以及Robert Martin在「Clean Code。敏捷軟件工藝手冊」中的錯誤處理章節(Prentice Hall,2008年)也有助於澄清爲什麼拋出未經檢查的異常保持更好的模塊性。 – climmunk