Spring事务嵌套导致的异常,Transaction rolled back because it has been marked as rollback-only

吾日三省吾身

Transaction rolled back because it has been marked as rollback-only

1. 原因

  • 线上故障,后来定位异常,最终发现是spring事务嵌套的导致的,特此记录

之前同事写的上传文件模块,因为涉及到上传到neo4j图形数据库,上传会比较慢,所以逻辑是这样处理的

  1. 上传后异步执行保存数据
  2. 保存成功后把操作记录的状态改为0,代表上传成功
  3. 前端调用上传接口后,循环调用操作记录的状态,如果状态为0则上传成功

我追查了代码,发现是事务嵌套的问题,网上搜了很多,最终

YourBatman的博客解决了我的问题
在这里插入图片描述

发生回滚(在类上添加了@Transactional注解,所以后面的方法都是有事务的)

1. 嵌套事务的情况,发生异常正常回滚
  • 添加transactional注解后当发生异常,回滚
    新增文章分类在这里插入图片描述
  • 新增文章
    在这里插入图片描述
  • 测试
    在这里插入图片描述

数据发生异常且正常回滚

2. 嵌套事务的情况,发生异常报Transaction rolled back because it has been marked as rollback-only

在这里插入图片描述

  • 使用try catch包起来,然后报异常
    在这里插入图片描述
  • 解决方案:在catch中添加TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  • 或者尽量不要在service中try catch
    在这里插入图片描述
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

失忆老幺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值