提问者:小点点

事务已回滚,因为它已被标记为仅回滚-意外回滚异常


我有这样的代码:

@Service
public class AService {


      public void methodA() {
           try {
               methodB();
            } catch (Exception e) {
               methodC(e);
            }
       }

 }

由于某种原因,当方法B抛出错误时,方法C中的写入不起作用,我得到了-意外回滚异常:事务回滚,因为它已被标记为仅回滚。

如果有任何建议,我将不胜感激,谢谢!


共2个答案

匿名用户

如果在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