【发布时间】:2011-10-30 20:22:57
【问题描述】:
我有一个 Spring 管理的服务方法来管理数据库插入。它包含多个插入语句。
@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 层捕获了所有 SQLExceptions,并使用 Spring 的 SQLExceptionTranslator 将它们转换为未经检查的 DataAccessExceptions。这个 Spring 论坛帖子 forum.springsource.org/… 和 Robert Martin 在“清洁代码。敏捷软件工艺手册”(Prentice Hall,2008 年)中的错误处理章节也有助于阐明为什么抛出未经检查的异常可以保持更好的模块化。跨度>
标签: spring transactions