【发布时间】:2010-10-01 21:38:33
【问题描述】:
我正在使用 Spring 2.5 事务管理,并且我有以下设置:
Bean1
@Transactional(noRollbackFor = { Exception.class })
public void execute() {
try {
bean2.execute();
} catch (Exception e) {
// persist failure in database (so the transaction shouldn't fail)
// the exception is not re-thrown
}
}
Bean2
@Transactional
public void execute() {
// do something which throws a RuntimeException
}
故障永远不会从 Bean1 持久化到 DB 中,因为整个事务都回滚了。
我不想在 Bean2 中添加 noRollbackFor,因为它用于很多没有逻辑来正确处理运行时异常的地方。
有没有办法避免我的事务仅在从 Bean1 调用 Bean2.execute() 时回滚?
否则,我想我最好的选择是在新事务中坚持我的失败?我还能做什么清洁?
【问题讨论】:
-
我不明白它为什么会回滚。您是否在 catch 块中重新抛出异常?
-
不,我不知道。似乎它正在回滚,因为 Spring TransactionInterceptor 在退出 Bean2 时将事务标记为回滚。
-
我解决了我的问题,方法是使用 REQUIRES_NEW 传播在新事务中持续失败。但我很想知道是否有更好的解决方案。
标签: spring transactions transactional spring-transactions