我有这样的代码:
@Service
public class AService {
public void methodA() {
try {
methodB();
} catch (Exception e) {
methodC(e);
}
}
}
由于某种原因,当方法B抛出错误时,方法C中的写入不起作用,我得到了-意外回滚异常:事务回滚,因为它已被标记为仅回滚。
如果有任何建议,我将不胜感激,谢谢!
如果在DB访问期间出现异常,Hibernate通常会将完整的事务标记为rollbackOnly
,即使会通过@Transactional(noRollbackFor=Exception. class)
注释属性显式地尝试避免这种行为。
因此,在这些情况下,需要有不同的解决方案,例如为两个方法调用提供单独的事务。
(类似问题:处理大数据插入的sql异常)
我假设您有一个由Spring(@Transactional
)在方法B
中某处管理的事务。在Spring中,当在该事务中抛出RuntimeException
时,该事务被标记为回滚。
来自Spring文档:
在其默认配置中,Spring Framework的事务基础结构代码仅在运行时、未经检查的异常的情况下将事务标记为回滚;也就是说,当抛出的异常是RuntimeException的实例或子类时。
参见:https://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html#transaction-declarative-rolling-back