spring 事务问题:Transaction rolled back because it has been marked as rollback-only

2023-11-10

问题描述:

同事测试时使用异常数据,代码报错但是并不是异常产生的错误,而出现:

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

中文翻译就是:

事务已回滚,因为它被标记成了只回滚

代码片段:

    // 我的代码
    @Transactional(readOnly = true, rollbackFor = Exception.class)
    public String select(String pid,String id) {
        List<Object> list = this.commonService.select(pid,id);
        if (CollectionUtils.isEmpty(list)) {
            throw new ApplicationException("查询数据异常");
        }
        ... 
    }
    
    .....
    // 调用代码
    @Transactional(readOnly = true, rollbackFor = Exception.class)
    public String select(String pid,String id) {
        try{
            // 针对异常进行捕获,但是没有抛出异常
            this.measureService.select(pid,id);
         }catch(ApplicationException e) {
            
         }
    }

错误原因分析:

A和B都有事务,A调用B,B中抛出了异常,A这边捕获B的异常,但是没有将异常抛出,导致A方法执行结束时,提交事务,出现了上述的错误

@Transactional原理:

@Transactional其内部是基于Aop实现的,

SpringAop异常捕获的原理:本拦截的方法需显示抛出异常,并不能经过任何处理,这样Aop代理才能捕获方法的异常,才能进行回滚,默认情况下Aop只捕获RuntimeException异常

这样原理就简单了,我们知道事务是可以继承的,那么A和B中可以理解为同一个事务,我们在B中进行了抛出了异常,然后再A中进行了捕获,但是没有抛出该异常,相当于在A中进行了处理,没有抛出该异常。细分下:B方法返回时,transcation已经被设置为rollback-only了,但是A这边捕获异常,没有继续向外抛,那么A方法结束时,就会由Aop来提交事务,但是此时transcation已经被设置为rollback-only了,所以就会抛出上述异常。

Rollback-only异常的解决:

1.B方法中我们可以手动捕获异常,并且处理该异常

        try {
            int i = 1/0;
        }catch (Exception e) {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }

2.B方法中的事务我们可以开启一个新的事务,与A中的事务不一样,这样A中出现异常回滚的事务与B中的事务不是同一个事务,这样话就可以避免上述的问题了,但是这样会出现一个问题,如果B中也有对数据的操作,那么B中出现异常,是不会让A中的事务回滚的。该方法适用于B中没有对数据的操作

// 在B中方法上添加注解,另开一个事务
@Transactional(propagation = Propagation.REQUIRES_NEW)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring 事务问题:Transaction rolled back because it has been marked as rollback-only 的相关文章

随机推荐

  • idea项目名后出现中括号别名

    本文来说下idea项目名后出现中括号别名的问题 文章目录 概述 概述 如下图所示 idea项目名后出现中括号别名 项目名出现中括号是因为iml文件名和项目文件名不一样 需要更改iml文件名
  • BLE蓝牙笔记----数据包解析

    本文是参考一些博文和书籍做的笔记 如有不适联系删除 参考 https www cnblogs com iini p 8977806 html BLE4 0 低功耗蓝牙 协议 总结 目录 1 广播包 1 1 PDU Type 1 2 MAC地
  • MySQL高级篇——存储引擎和索引

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud 黑马旅游 谷粒商城 学成在线 牛客面试题 java黑马笔记 目录 一 存储引擎 1 1 查看 设置存储引擎的命令
  • docker运行jar包加载外部配置文件

    1 创建Dockerfile文件 FROM java EXPOSE 8083 ADD data app 3 2 1 SNAPSHOT jar smart jar COPY application properties RUN bash c
  • 异常处理:让你的代码更加健壮

    简介 异常在编程中扮演着重要的角色 就像生活中的意外事件一样 它们是指在代码执行过程中可能发生的错误 从简单的空指针错误到复杂的文件读取错误 在这篇博客中 我们将深入了解异常的各个方面 包括异常的类型 处理方式以及如何自定义异常 目录 异常
  • oracle查询表空间大小以及每个表所占空间的大小

    1 查询数据库中所有的表空间以及表空间所占空间的大小 直接执行语句就可以了 select tablespace name sum bytes 1024 1024 from dba data files group by tablespace
  • mysql处理null值_详解MySQL处理NULL值的方法提高性能

    本文主要介绍的是MySQL数据库NULL的实际用法以及其实际应用代码的描述 以下就是文章的详细内容描述 望你会有所收获 1 对含空值列进行排序 建表 mysql gt create table t1 col1 int primary key
  • 解决Openwrt安装插件提示一下错误的办法

    解决Openwrt安装插件提示一下错误的办法 Openwrt安装17ce插件 提示一下错误 Collected errors check data file clashes Package 17ce wants to install fil
  • GLSL std140布局规则

    标准uniform块布局 The following example illustrates the rules specified by the std140 layout layout std140 uniform Example Ba
  • vue+elementui el-switch按钮的文字居内

    效果图 代码 UI图需求是将文字放在switch里面 而elementui默认的文字是在外面 这时候就要改样式了 可根据需求更改下面代码样式
  • SpringCloud Gateway整合Spring Security Webflux的关键点(痛点解析),及示例项目

    最近公司项目需要用到后端的认证 授权 且公司项目目前是基于SpringCloud Gateway的 所以想到都是一家的产品就决定使用Spring Security了 但是在整合过程中 经历了种种磨难 所以把最终的整合关键点列出来 让需要的读
  • 写一段关于社会福利最大化模型的实时定价的matlab代码

    我抱歉地告诉您 我不能为您提供完整的 Matlab 代码 因为这需要很多细节和预处理来实现 但是 我可以向您展示一些关于社会福利最大化模型实时定价的代码片段 以下是一个示例 Matlab 代码片段 其中展示了如何使用 fmincon 函数来
  • 求最大数(c语言)

    include
  • python判断列表是否有重复数据_Python如何判断列表里是否有重复元素

    Python如何判断列表里是否有重复元素 发布时间 2020 10 28 02 54 38 来源 亿速云 阅读 122 作者 小新 小编给大家分享一下Python如何判断列表里是否有重复元素 希望大家阅读完这篇文章后大所收获 下面让我们一起
  • 2020年给应届程序员,几点求职面试的建议

    简历书写 作为一个应届毕业生 如何让我们的简历出众 可以让hr一眼相中你呢 个人觉得以下几点很重要 1 项目经历或者大赛获奖经历 亮点 这里的项目经历不是你做得demo或者你在学校做得课程设计 而是实实在在的要给客户使用的软件 我一直有一个
  • Vue项目开发介绍

    Vue项目目录介绍 node modules 内部有很多当前项目依赖的模块 public 存放页面图标和不支持 JavaScript 情况时的页面 favicon ico 网站小图标 index html spa单页面应用 src 存放 v
  • CXF提供Client调用WebService接口的方法

    1 JaxWsProxyFactoryBean 简介 调用方式采用了和RMI类似的机制 即客户端直接服务器端提供的服务接口 interface CXF通过运行时代理生成远程服务的代理对象 在客户端完成对webservice的访问 几个必填的
  • 小样本利器1.半监督一致性正则 Temporal Ensemble & Mean Teacher代码实现

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • Radon变换

    转自 http baike baidu com view 2435650 htm 两维情况下radon变换大致可以这样理解 一个平面内沿不同的直线 直线与原点的距离为d 方向角为alfa 对f x y 做线积分 得到的像F d alfa 就
  • spring 事务问题:Transaction rolled back because it has been marked as rollback-only

    问题描述 同事测试时使用异常数据 代码报错但是并不是异常产生的错误 而出现 Transaction rolled back because it has been marked as rollback only 中文翻译就是 事务已回滚 因