声明式事务(@Transactional)使用时需要注意的坑

news2024/11/24 4:22:17

 前言

 上两篇文章已经详细分析了申明式事务的实现原理,知道了底层原理之后,现在就可以开始使用申明式事务去简化我们的代码了。但是在使用@Transactional注解的时候也会经常遇到一些问题,有些问题不仔细测试观察的话还不容易发现,比如:事务失效,部分数据回滚,导致数据不一致等。这篇文章就来列一下使用@Transactional注解时应该注意哪些问题。


一、@Transactional事务不生效的各种场景

1.1 在同一个类中,有两个添加了@Transactional注解的方法A和B,A方法调用B方法,B方法事务不生效

  原因是A方法上面添加了事务的注解,所以是通过AOP生成的代理对象去调用被增强之后的方法,但是方法A调用同一个类中的另外一个添加了注解的B方法则是通过当前对象,也就是this去调用的,this并不是增强过后的代理对象,所以没有被AOP添加事务增强。同理其他的注解也是这样,这种情况也是会导致B方法上面的注解失效,如@Async等。

1.2 在非public方法上面添加@Transactional注解

  由于注解是基于AOP动态代理生成代理对象调用增强方法的,如果方法为非public的方法,则无法通过动态代理调用方法和增强方法。

1.3 注解中配置了rollbackFor熟性,但是抛出的异常并不是所配置的属性

@Transactional注解的rollbackFor默认是RuntimeException才会进行回滚,所以当方法抛出Exception的时候是不会触发事务的回滚的。

这个方法并不会让事务回滚,因为这里抛出的是Exception,事务默认是RuntimeException才会进行回滚。所以可以改成@Transactional(rollbackFor = Exception.class)

1.4 数据库引擎设置成了MyISAM

MyISAM引擎是一个适合查询的数据库引擎,它是不支持事务和索引的,所以当引擎为MyISAM的时候,事务是不生效的

1.5 在方法中使用了try catch将异常捕获了

如果方法中使用了try catch捕获了异常,而且异常并没有抛出来,则事务也不会进行回滚

1.6 多线程操作事务

如果主线程需要先执行一些修改数据库的操作,当子线程在进行处理出现异常时,主线程修改的数据则不会回滚。因为需要事务生效前提是操作的是同一个数据库的connect,而多线程的情况下,操作的都不是同一个connect,所以会导致事务不生效。

1.7 使用了特殊的事务传播特性

比如在使用PROPAGATION_REQUIRES_NEWPROPAGATION_NESTED传播特性之后,在子事务回滚之后父事务是不会回滚的,所以这就可能造成事务没生效的误解。在使用传播特性的时候一定要了解各种传播特性的作用。引入大佬文章《Spring事务的传播特性和隔离级别》

二、申明式事务的其他特性

2.1 @Transactional添加readOnly = true提高只读方法的性能

《@Transactional(readOnly=true) 真的是提高性能的灵丹妙药吗?》

文章大概总结了@Transactional添加readOnly = true属性可以提高只读方法的性能的原理

  • 性能改进:只读实体不进行脏检查

  • 节省内存:不维护持久状态的快照

  • 数据一致性:只读实体的更改不会持久化

  • 当我们使用主从或读写副本集(或集群)时,@Transactional(readOnly = true)使我们能够连接到只读数据库

但是在日常开发中,我们是不会在一个只读方法上添加@Transactional注解的,但是需要注意的是,当一个非只读方法上面有@Transactional注解,而这个方法调用了只读方法,只读方法也会被事务增强,这个场景才需要在只读方法上添加@Transactional(readOnly=true)

2.2 多线程事务怎么回滚

《支付宝一面:多线程事务怎么回滚?说用 @Transactional 可以回去等通知了!》

2.3 事务的隔离级别相关

《MYSQL事务的隔离性之MVCC》


总结

本文主要是总结神秘式事务 @Transactional在使用需要我们去注意的问题,正确的使用事务是在日常开发中所必须具备的技能,不然可能会造成数据的不准备等问题。所以在使用事务的时候必须先全面的理解它,才能够使用好它。如果有需要补充的,感谢提供宝贵的意见

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

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

相关文章

Windows vbs脚本定时给焦点窗口发送消息

直接上脚本代码,你们可以自己看着改 MsgInputbox("message1") Msg1Inputbox("message2") numInputbox("number")a1 bnumset wshshellCreateObject("wscript.shell") 创建Windows的shell对象打开shell窗口 wscript.sleep 5000for ia t…

vue本地调试devtools

一、谷歌浏览器加载扩展程序 二、把解压的压缩包添加即可,重启浏览器 三、启动前端本地项目,即可看到Vue小图标

Linux|awk 特殊模式“BEGIN 和 END”

引言 在本文[1],我们将介绍Awk的更多特性,特别是两个特殊的模式:BEGIN和END。 这些独特的功能在我们努力扩展和深入探索构建复杂Awk操作的多种方法时,将大有裨益。 实例 让我们从Awk系列的开篇回顾开始,回想一下&#…

SSL证书一般是怎么收费的?

SSL证书的费用通常按照以下几个因素决定: 1. 证书类型: - 域名验证(DV)证书:这是最基本的类型,仅验证域名所有权,费用一般在几十到几百之间. - 组织验证(OV)证书&#xf…

【触摸案例-手势解锁案例-九宫格 Objective-C语言】

一、手势解锁案例,九宫格,我们先来分析一下怎么实现: 首先呢,我们先来运行一下, 这一块儿,上面的这九个东西,肯定是要有一个九宫格的一个算法的问题,然后呢,上边的这九个小圆圈儿,这是什么东西,Button,为什么是Button,因为可以点,是吗,就因为这个?实际上,你用…

LeetCode55:跳跃游戏

题目描述 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 解题思想 每次…

软考-信息系统项目管理师-论文技术架构模板(60天备考第26天)

分享一段信息系统项目管理师论文项目技术架构描述的万能模板,供大家参考。距离考试还有二十八天,如果论文写不好的可以加微进论文指导群学习论文写作。 该系统前端基于Vue开发,后端基于java开发,前后端分离部署。整体采用B/S架构&…

【webrtc】MessageHandler 5: 基于线程的消息处理:以PeerConnection信令线程为例

peerconn的信令是通过post 消息到自己的信令线程消息来处理的PeerConnectionMessageHandler 是具体的处理器G:\CDN\rtcCli\m98\src\pc\peer_connection_message_handler.hMachinery for handling messages posted to oneself PeerConnectionMessageHandler 明确服务于 signalin…

公网ip申请ssl仅260

现在很多网站都已经绑定域名,因此使用的都是域名SSL证书保护网站传输信息安全,而没有绑定域名只有公网IP地址的网站想要保护传输信息安全就要申请IP SSL证书。IP SSL证书也是由正规CA认证机构颁发的数字证书,用来保护用户的隐私以及数据安全&…

容器工作流

背景 目前某平台使用计算容器和解析容器,这两种容器目前通过rabbitmq消息来进行链接,形成容器工作流,使用容器工作流框架可以省去两个容器中间环节的控制,不需要再使用java代码对容器的操作,通过容器工作流框架即可控…

资深项目经理15年心得:管理需求变更5大技巧

高效管理需求变更对项目管理至关重要。通过严格的变更控制,确保所有需求变更都与项目目标和范围保持一致,避免偏离原定计划,有助于项目按既定目标顺利推进。能够及时评估变更对项目的影响,有利于减低项目延期和超支的风险&#xf…

特斯拉PIXCELL矩阵大灯擎耀远程控制技术照亮未来智能之光

在科技的浪潮中,特斯拉这个名字如同一道闪电,照亮了新能源汽车的天空。而在这片星空中,特斯拉PIXCELL矩阵大灯则如同一颗璀璨的星辰,以其独特的创新技术和卓越的性能,为驾驶者提供了前所未有的照明体验。矩阵大灯技术如…

OceanBase开发者大会实录-杨传辉:携手开发者打造一体化数据库

本文来自2024 OceanBase开发者大会,OceanBase CTO 杨传辉的演讲实录—《携手开发者打造一体化数据库》。完整视频回看,请点击这里>> 各位 OceanBase 的开发者,大家上午好!今天非常高兴能够在上海与大家再次相聚&…

Android View事件分发面试问题及回答

问题 1: 请简述Android中View的事件分发机制是如何工作的? 答案: 在Android中,事件分发机制主要涉及到三个主要方法:dispatchTouchEvent(), onInterceptTouchEvent(), 和 onTouchEvent(). 当一个触摸事件发生时,首先被Activity的…

广交会烹饪机器人用上大模型 支付宝小程序云提供技术支持

近日,第135届广交会正在火热进行,记者获悉,支付宝小程序云助力合作伙伴田螺云厨,在烹饪机器人上开始用上大模型技术。各类智能产品的亮相,从中国制造迈向中国创造,也成为广交会的一个亮点。 (图…

HR招聘选拔,什么是人才测评方法?

人才测评方法是人才测评系统的一个构成部分,在一个系统指引之下,研究人员会根据具体的情况,选择出一套合适的人才测评方法,以便于系统更好地实现目标。每一种人才测评方法,都有自己的适用范围,企业工作者须…

数据可视化在不同行业中有哪些应用?

数据可视化即通过图表的形式将数据的内在信息有逻辑性地呈现给用户,使用户更容易发现数据中蕴藏的规律,找出问题,进而做出决策;另一方面,数据可视化项目也是一张重要的名片,是企业数字化建设效果的呈现。本…

Spring Cloud Feign

序言 本文给大家介绍一下 Spring Cloud Feign 的基础概念以及使用方式。 一、远程调用 在传统的单体系统中,我们通常是客户端去请求服务端的接口。但是在分布式的系统中,常常需要一个服务去调用另外一个服务的接口。在服务端如何去调用另外一个服务端…

源码篇--Nacos服务--中章(8):Nacos服务端感知客户端实例变更-3

文章目录 前言一、客户端实例变更:二、实例变更感知:2.1 实例注册信息通知:2.1.1 接收DistroDataRequest 请求:2.1.2 onReceive 处理请求:2.1.3 processData 处理请求:2.1.4 handlerClientSyncData 处理数据…

C++学习第十四课:运算符类型与运算符重载

C学习第十四课:运算符类型与运算符重载 在C中,运算符重载是一种使得自定义类型(如类对象)能够使用C内建运算符的能力。运算符重载允许程序员定义运算符对用户定义类型的特殊行为,这增加了程序的可读性和自然表达能力。…