我正在使用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()时回滚事务?
否则,我想我最好的选择是在新交易中坚持我的失败?还有什么干净的我可以吗?
答案 0 :(得分:1)
这是注释的注意事项之一......你的课程不可重复使用!
如果你在XML中配置你的交易,那将是可能的。
假设您使用XML配置:如果它不消耗昂贵的资源,您可以创建另一个bean2实例以使用您指定的代码。也就是说,您可以按照上面的指定配置一个,并且可以配置一个没有回滚的异常。