当前位置: 首页 > news >正文

Transaction rolled back because it has been marked as rollback-only问题解决

transaction rolled back because it has been marked as rollback-only
简略总结=>
发生场景:try-catch多业务场景
发生原因:业务嵌套,事务管理混乱,外层业务与内层业务抛出异常节点与回滚节点不一致。
解决方式:修改业务的事务嵌套关系为[ NESTED ],保证内层业务的异常不会设置外层的回滚

Spring中的事务拥有多种隔离机制,类似默认的REQUIRED,REQUIRES_NEW。
这个问题会发生的原因则是事务的隔离机制问题。
业务A是外层业务,调用了业务B内层业务。并且try-catch了它
类似

public void testA(){
    try{
    	testB();   
    }catch(){
    }
}

如果这是一个有事务的场景,那么如果testB()方法抛出异常,而异常被testA()的
try-catch捕获了,那么spring在执行testA()的事务commit时就会抛出
transaction rolled back because it has been marked as rollback-only的异常。
因为内层业务在发生异常的时候,标注了改事务是需要回滚的,但是外层捕获了异常后继续执行,方法完成以后提交便出错了,无法提交需要被回滚的内容。

解决方法则是修改testA()与testB()之间的事务隔离,将本来继承或者加入testA()事务的testB()的事务隔离级别设置为 NESTED;

@Transactional(propagation = Propagation.NESTED,rollbackFor = Exception.class)

nested的意思是嵌套事务,如果外层有事务那么嵌套一个事务在其中,如果不存在事务则新建一个事务。参考地址:NESTED
如果使用了这个级别,那么testB()会嵌套在testA()里,遇到异常时会回滚到开始执行testB()的数据,将原来的整体事务回滚修改为局部事务回滚,这样的话在testA()捕获了异常以后也不会影响testA()的其他业务执行。

另话:
除了NESTED外还有REQUIRES_NEW这个级别,它是新建一个新的事务,和NESTED的区别就是,REQUIRES_NEW是两个事务,同级,A跟B各自创建了一个事务,NESTED是父子级,B的事务在A里面。为什么这里选用了NESTED的级别没用REQUIRES_NEW呢,是因为我在做业务的时候发现使用REQUIRES_NEW包住的代码无法写入数据库,因为外层testA()的事务没有结束,数据库的表被testA()锁住了,导致无法写入,NESTED则没有这种问题。

相关文章:

  • windows克隆项目找不到,修改git bash中存储的账号密码
  • 如何查看安卓版本号的方法(例如查看是13、12、11、10...)
  • 齿轮热处理学习笔记分享
  • 【MySQL】基本查询(表的增删查改+聚合函数)
  • MySQL 进阶学习文档
  • 工作记录 2017-02-08
  • 区块链交易签名相关知识总结
  • 经典面试题:C/C++中static关键字的三大核心作用与实战应用
  • 详解过程内聚、时间内聚、顺序内聚、逻辑内聚
  • OpenCV旋转估计(1)用于估计图像间仿射变换关系的类cv::detail::AffineBasedEstimator
  • 8.2《二力平衡》
  • 好看的网络安全登录页面 vue http网络安全
  • 重要重要!!改进求取Fisher矩阵的方法: 加权正则化Fisher矩阵
  • 蓝桥备考--必考题型--广度优先搜索bfs
  • 带旋转的目标标注工具-X-AnyLabeling
  • 【pytest框架源码分析五】pytest插件的注册流程
  • 基于Netty实现高性能HTTP服务的架构解析
  • 设备健康管理:给工业设备装上 “智能体检中心”—— 从故障救火到全生命周期守护
  • 基于SpringBoot的“ERP-物资管理”的设计与实现(源码+数据库+文档+PPT)
  • WPF 开发从入门到进阶(五)
  • 北京亦庄启动青年人才创新创业生态示范区
  • 南京106亿元成交19宗涉宅地块:建邺区地块楼面单价重回4.5万元
  • 马上评|什么才是地方文旅宣传的正确姿势
  • 广东省副省长刘红兵任湖南省委常委、宣传部部长
  • 2025年度中国青年五四奖章暨新时代青年先锋奖评选揭晓
  • 李铁案二审今日宣判