吾日三省吾身

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

1. 原因

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

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

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

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

YourBatman的博客解决了我的问题
Spring事务嵌套导致的异常,Transaction rolled back because it has been marked as rollback-only

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

1. 嵌套事务的情况,发生异常正常回滚
  • 添加transactional注解后当发生异常,回滚
    新增文章分类Spring事务嵌套导致的异常,Transaction rolled back because it has been marked as rollback-only
  • 新增文章
    Spring事务嵌套导致的异常,Transaction rolled back because it has been marked as rollback-only
  • 测试
    Spring事务嵌套导致的异常,Transaction rolled back because it has been marked as rollback-only

数据发生异常且正常回滚

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

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

  • 使用try catch包起来,然后报异常
    Spring事务嵌套导致的异常,Transaction rolled back because it has been marked as rollback-only
  • 解决方案:在catch中添加TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  • 或者尽量不要在service中try catch
    Spring事务嵌套导致的异常,Transaction rolled back because it has been marked as rollback-only

相关文章:

  • 2023-01-08
  • 2021-04-27
  • 2022-12-23
  • 2022-12-23
  • 2021-11-22
  • 2021-10-29
  • 2021-07-04
  • 2021-11-21
猜你喜欢
  • 2022-12-23
  • 2021-11-29
  • 2021-12-20
  • 2021-07-27
相关资源
相似解决方案