我又被Spring的事务坑了,用户兑奖之后,什么东西都没收到!!

news2024/11/13 12:16:10

没错,我又被事务坑了!

即上次的mq发送消息之后,业务代码回滚,导致发了一条中奖消息给用户!!,这次又被spring的事务坑了

这次是这样的,一个兑奖接口进来,我们先改变了这条数据的状态为已兑奖,之后我们就调用其他微服务的rpc方法,但是,rpc方法是会抛出个受检查的异常的,所以我们必须捕获,但是我们兑奖的方法上面又加了个@Transactional注解来控制事务,代码类似这样的:

   @Override
    @Transactional
    public Result update(DTO dto) {

        //更换状态
      Mapper.updateStatusById( 1 , dto.getId());
        String lessonWareAttrIds = null;
        try {
          	//调用其他服务rpc接口
        } catch (RpcException e) {
            log.error("兑奖失败", e);
        }
      
        return Result.success();
    }

嘿嘿嘿,您猜结果怎么着,rpc方法调用失败,但是表状态被变了,还好我及时改了过来,保住了我的绩效。

所以这次我们来谈谈spring 中的@Transactional注解事务

事务失效

首先我们要知道@Transactional在什么情况下会失效

第一种:自己处理掉了

第一种就像我们的案例一样,如果你把异常捕获到了,那么事务自然也就不生效了。因为事务就是要告诉spring,我发送异常了,我处理不了,我要抛给你,你自己看着办吧,但是你一旦catch掉了,说明你自己可以解决,那么spring自然也不会接管你的事务。


其次我们就要知道,spring事务的实现原理是什么:Spring框架中的事务管理主要通过AOP(面向切面编程)机制来实现,而AOP大家已经很熟悉了,那就是底层其实是通过代理去实现的,也就是说,如果没有被spring代理,那么这个事务自然就不会成功,例如下面的几种情况:

第二种:不是spring的bean

不是spring的bean,那自然就不会走spring代理,spring也无法通过aop去处理它,这个很好理解吧,那么这种情况也会失效:

image-20240729153150747

第三种:自己调用自己的方法

image-20240729165913190

接触过代理模式的都知道:都是先调用代理类的方法,再在代理类方法里面调用原方法,什么?你居然不知道代理模式?

如果不知道也没关系,现在就去恶补之前博主写的文章:【设计模式】我终于读懂了代理模式。。。

自己调用自己的方法,这种情况就属于没用通过代理类去调用test2方法,是自己去调用的,根据我们上面说的事务的原理,这样的写法自然而然就不会走事务了。。

第四种:方法设置为final关键字

image-20240729182256249

我们可以看到,这里如果方法是final的话也是不会走代理方法的,原理和上面的类似,如果没被代理,则不会走事务

第五种,方法不为public

默认情况下,@Transactional 注解只对public方法有效。这是因为Spring的AOP(面向切面编程)代理默认使用的是基于接口的代理(JDK动态代理),这种代理只能拦截到public方法。但是要注意,如果使用CGLIB代理,其实也是可以用的,但是为了避免这种情况,还是为public较好哦。


那么上面呢除了第一种情况,基本就是没走代理所出现的事务失效的几种情况了。

第六种:不是默认的异常

image-20240729175025554

Java的异常体系结构以Throwable为根,分为Error和Exception两大类,其中Exception又分为编译时异常(Checked Exceptions)和运行时异常(Unchecked Exceptions)。

@Transactional注解默认情况下只处理未检查异常(unchecked exceptions),也就是运行时异常(RuntimeException及其子类)。


如果你了解mysql的事务你就知道,在学习spring的事务中,其实就是对应的mysql的事务,如果你把mysql的事务先学习了,那么spring的事务其实也就那么一回事。

什么?你居然不知道mysql的事务?建议去恶补一下mysql的事务,或者读一读作者之前写过的:

你不能不知道的脏写,脏读,不可重复读,幻读超级详细解读

这里面就是对于数据库的操作就是一个事务。只有全部成功或者全部失败。

在一个方法上面添加了@Transactional注解,你可以理解的操作就是这一个方法就是一个mysql里面的事务了,这么理解是不是豁然开朗了,如同醍醐灌(不是)

那么一个方法是在一个线程里面去跑的,那么多线程是不是就是在多线程里面跑了(废话),所以引出了下面的情况:

第七种:多线程情况下

image-20240729195114916

这个时候如果c类里面的方法回滚了,那么这个test方法也是不会回滚的,回到我们开始说的:一个线程一个事务,是不是就可以理解了,那都不是一个事务,所以就不会一起回滚了。

第八种:mysql存储引擎不为innodb

mysql的存储引擎:

MyISAM:不支持事务,使用表级锁,适合读多写少的场景。
InnoDB:支持事务,使用行级锁,适合高并发和需要事务处理的场景。

上面我们又说了,可以把spring的事务看做是mysql的事务,如果你要操作数据库的话,那你本身数据库不支持事务,那么spring配置了事务也没用。Spring的事务管理和数据库的事务支持是紧密相关的。有句话说的好:巧妇难为无米之炊


以上就是博主列举了几个事务会失效的常见的坑,比市面上其他的教程讲的更通俗易懂吧(我是这么觉得的),下次我们来讲一下Spring的事务传播性。大家在开发过程中应该避免踩这些个坑,在开发过程中别像博主一样犯第一总错误,到时候自己的绩效又变成了C,那就两行泪了。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2128215.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

输入一段文字,瞬间生成应用。Furion低代码平台与AI协同工作,展现出非凡的效率与精准。

引言:展示问题背景 在当今快速变化的商业环境中,企业面临着前所未有的挑战。随着数字化转型的加速,企业对应用开发的需求日益增加。然而,传统的应用开发流程通常需要耗费大量时间和资源,从需求分析、设计、编码、测试到…

概念科普|ChatGPT是什么

一、引言 在人工智能的迅猛发展中,ChatGPT作为前沿技术的代表,其原理和运作方式成为了研究和讨论的热点。 常有观点将ChatGPT比喻为一种高级词语接龙,通过海量数据的学习与训练,机器能够根据给定的文本内容续写出下文&#xff0…

小米商业营销陈高铭:品牌应该多方整合,关注高质量营销 | SMARTIES CHINA 2024终审报道②

小米互联网业务部商业营销品牌总经理 陈高铭 近日,SMARTIES CHINA 2024终审活动在苏州音昱水中天落下帷幕。来自各行业的40位品牌广告主代表,历时两天时间,通过紧张的评审和精彩的讨论,从178个优秀入围案例中评选出了每个类别的金…

数据分析-螺旋环状气泡图

1 原理 采用阿基米德螺线原理,即以一个点匀速离开一个固定点的同时又以固定的角速度绕该固定点转动而产生的轨迹。具体原理见:阿基米德螺线。坐标轴公式为: 其中x为横坐标,y为纵坐标,r为离中心点的半径,为坐…

茶叶商家开店拓客线上发展增长生意

部分地区的人群酷爱喝茶,其他地区也有大量购茶者,其爱好者对茶叶的种类、年份季节口感度、价格等有着较高要求,花茶、绿茶、红茶、白茶、龙井、碧螺春、乌龙茶等,国内国外庞大市场,不能仅局限于本地附近客户&#xff0…

【ArcGIS】栅格计算器原理及案例介绍

ArcGIS:栅格计算器原理及案例介绍 栅格计算器(Raster Calculator)原理介绍案例案例1:计算栅格数据平均值 参考 栅格计算器(Raster Calculator)原理介绍 描述:在类似计算器的界面中,…

跨境独立站支付收款常见问题排雷篇1.0丨出海笔记

最近小伙伴们在社群讨论挺多关于独立站支付问题的,鉴于不少朋友刚接触独立站,我整理了一些独立站支付相关的问题和解决方案,供大家参考,百度网上一堆媒体的那些软文大家就别看了,都是软广或者抄来抄去,让大…

华为 昇腾 310P 系列 AI 处理器支持 140Tops 的 AI 算力。

1、产品简介 模组是基于昇腾 310P 系列 AI 处理器设计而成,可实现图像、视频等多种数据分析 与推理计算。超强的视频编解码能力以及支持 140Tops 的 AI 算力。在边缘侧及端侧的嵌入式计算 领域,有着极高的性价比,具有超强算力、 超高能效、…

2024最新版mysql数据库表的查询操作-总结

序言 1、MySQL表操作(创建表,查询表结构,更改表字段等), 2、MySQL的数据类型(CHAR、VARCHAR、BLOB,等), 本节比较重要,对数据表数据进行查询操作,其中可能大家不熟悉的就对于INNER JOIN(内连接)、LEFT JOIN…

产业互联网新星闪耀,“太行云商”引领传统产业数字化革命

产业互联网新星升起 晋城,作为我国能源及相关产业的重要基地,一直面临着信息协同不畅、存货供需失衡、资金融通困难等诸多挑战。 2023年,为了应对这些难题,晋城市政府携手AMT企源,成立了太行云商科技有限公司&#x…

【生日视频制作】蓝色飞机机身AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程蓝色飞机机身AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程 AE模板套用改图文教程↓↓: 怎么如何做的【生日视频制作】蓝色飞机机身AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤: 下载AE模板 安装AE软件…

串口调试助手+串口打印配置

目录 一、使用CUBE_MX配置串口 二、KEIL5配置 1.打开usart.c文件 2.打开main.c文件 在main函数中: 一、使用CUBE_MX配置串口 二、KEIL5配置 1.打开usart.c文件 UART_HandleTypeDef huart1;void MX_USART1_UART_Init(void) {/* USER CODE BEGIN USART1_Init 0 …

【Proteus51单片机仿真】YL-69湿度检测和继电器电机自启动

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于AT89C51单片机,湿度检测模块通过ADC0832数模转换器,将模拟信号转换为数字信号给单片机,然后通过LCD1602显示屏显示出当前的湿度值,并判断当前湿度值是…

大模型的第一个杀手级应用场景出来了

大家终于都意识到大模型首先改变的是软件行业自己,而软件的根基是代码生成。代码生成第一波就是AI辅助开发,这个会是大模型第一个杀手级应用。大家苦苦逼问自己的大模型杀手级应用,为什么会是辅助编程,这里说下什么: 必…

数据集 Total-Text 文本检测 >> DataBall

开源数据集 Total-Text 文本检测 深度学习 人工智能 Total-Text 是一个文本检测数据集,由 1,555 张图像组成,具有多种文本类型,包括水平、多向和弯曲文本实例。训练分割和测试分割分别有 1,255 张图像和 300 张图像。 article{CK2019, author…

时序预测 | Matlab实现PSO-CNN粒子群优化卷积神经网络时间序列预测

时序预测 | Matlab实现PSO-CNN粒子群优化卷积神经网络时间序列预测 目录 时序预测 | Matlab实现PSO-CNN粒子群优化卷积神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现PSO-CNN粒子群优化卷积神经网络时间序列预测(完整源码和数…

新手教学系列——用Nginx将页面请求分发到不同后端模块

在当今的Web开发中,前后端分离架构已经成为主流,尤其是大型应用项目。前端可以通过Vue这样的框架来统一管理页面和用户交互,而后端则通常会拆分成多个微服务模块,以便应对不同业务需求和功能扩展。在这样的架构下,Nginx作为一个高效、灵活的Web服务器,能够帮助我们将前端…

打造自己的大模型LLMs!独家训练秘籍!

目录 前言大语言模型 Vs机器学习模型训练过程 步骤1:数据策划(Data Curation)步骤2:格式化与预处理步骤3:训练模型步骤4:模型评估 LLM Leaderboard [LLM Leaderboard 2024](https://www.vellum.ai/llm-leaderboard)[O…

怎么修改mvn的java版本

在maven所在目录下的bin目录中找到 mvn.cmd 文件,选中这个文件后,鼠标右键选择编辑。 在第一行添加java对应版本号的jre的路径 再次重新查看cmd下的指定的mvn -version的java版本

HT513 2.8W I2S 输入单声道D类音频功率放大器

特征 电源供电: PVDD 2.5-6.5V; DVDD/AVDD 3.3V 灵活的音频输入: -I2S, LJ, RJ, TDM 输入 -8,16,32,44.1,48,88.2,96,192kHz 采样频 率输出功率: 1.40W (PVDD3.6V,RL4Ω,THDN10%) 2.80W(PVDD5.0V,RL4Ω,THDN10%) 4.70W(PVDD6.5V,RL4Ω,THDN10%) THDN0.08%(PO1W, RL4Ω, PVDD …