吾日三省吾身
Transaction rolled back because it has been marked as rollback-only
1. 原因
- 线上故障,后来定位异常,最终发现是spring事务嵌套的导致的,特此记录
之前同事写的上传文件模块,因为涉及到上传到neo4j图形数据库,上传会比较慢,所以逻辑是这样处理的
- 上传后异步执行保存数据
- 保存成功后把操作记录的状态改为0,代表上传成功
- 前端调用上传接口后,循环调用操作记录的状态,如果状态为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