cli*_*unk 25 spring transactions
我有一个Spring管理的服务方法来管理数据库插入.它包含多个插入语句.
@Transactional
public void insertObservation(ObservationWithData ob) throws SQLException
{
observationDao.insertObservation(ob.getObservation());
// aop pointcut inserted here in unit test
dataDao.insertData(ob.getData());
}
Run Code Online (Sandbox Code Playgroud)
我有两个单元测试,在调用第二个插入之前抛出异常.如果异常是RuntimeException,则回滚事务.如果异常是SQLException,则第一个插入是持久的.
我很困惑.任何人都可以告诉我为什么事务不会回滚SQLException?任何人都可以提出如何管理这个的建议吗?我可以捕获SQLException并抛出RuntimeException,但这看起来很奇怪.
ska*_*man 42
这是定义的行为.来自文档:
任何
RuntimeException
触发器回滚,任何已检查的异常都不会.
这是所有Spring事务API的常见行为.默认情况下,如果RuntimeException
从事务代码中抛出a ,则将回滚事务.如果RuntimeException
抛出已检查的异常(即非a ),则不会回滚该事务.
这背后的基本原理是RuntimeException
Spring通常采用类来表示不可恢复的错误条件.
如果您希望这样做,可以从默认值更改此行为,但如何执行此操作取决于您使用Spring API的方式以及如何设置事务管理器.
对于@Transactional
,默认情况下,回滚仅在运行时发生,仅发生未经检查的异常。因此,您检查的异常SQLException
不会触发事务的回滚;rollbackFor
可以使用和注释参数来配置行为noRollbackFor
。
@Transactional(rollbackFor = SQLException.class)
public void insertObservation(ObservationWithData ob) throws SQLException
{
observationDao.insertObservation(ob.getObservation());
// aop pointcut inserted here in unit test
dataDao.insertData(ob.getData());
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
26604 次 |
最近记录: |