springboot 事务 Transaction 异常 Transaction rolled back because it has been marked as rollback-only

问题描述:

@Transactional(rollbackFor = Exception.class)
public void methodA()  {
    methodB();
}

public void methodB(){
    try{
        // 某段数据库操作方法触发异常,这个很重要哦,不是数据库操作方法触发不了事务回滚机制
        // 具体不太清楚,猜测类似于内部事务出现异常
    }catch(){
        logger.info("异常出现了,但不抛出,内部消化了");
    }

}

最终会抛出异常 Transaction rolled back because it has been marked as rollback-only

并回滚。

但是重点来了,正常如果想正常回滚,又不想出现这个 rollback-only 异常提示,只需要在catch中重新抛出异常就可以了,问题是我不想回滚,还想让程序走下去。

解决方法:

//事务管理
    private DataSourceTransactionManager dataSourceTransactionManager = SpringUtils.getBean(DataSourceTransactionManager.class);
    private TransactionDefinition transactionDefinition = SpringUtils.getBean(TransactionDefinition.class);

public void methodB(){
    try{
        // 手动开启一个事务
        TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
        //这句代码是重点,
        dataSourceTransactionManager.setGlobalRollbackOnParticipationFailure(false);
        // 某段数据库操作方法触发异常,这个很重要哦,不是数据库操作方法触发不了事务回滚机制
        // 具体不太清楚,猜测类似于内部事务出现异常
    }catch(){
        logger.info("异常出现了,但不抛出,内部消化了");
    }
    // 提交事务
    dataSourceTransactionManager.commit(transactionStatus);
    // 恢复配置
    dataSourceTransactionManager.setGlobalRollbackOnParticipationFailure(true);

}

参考资料:Spring-Boot 出现Transaction marked as rollback only异常_- JackCen的博客-CSDN博客

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值