听我的,事务注解真的别乱动!

在这里插入图片描述

更多大厂面试内容可见 -> http://11come.cn

听我的,事务注解真的别乱动!

背景

故事的起源: 发现存在重复插入数据库的现象,通过排查发现是因为事务中包了锁

原因分析: 当线程 1 释放锁之后,但是此时还未提交事务,线程 2 此时抢到锁,去执行数据库插入数据,此时由于线程 1 的事务未提交,线程 2 读取不到新插入的数据,所以会插入重复数据

image-20240725210647948

这里在方法 1 和方法 2 上都有事务注解,根据默认的事务传播机制,方法 2 会加入到方法 1 的事务中,导致方法 2 执行完毕之后,要过一段时间才会提交整个事务,在这一段时间内,就会重复插入数据

而且由于业务原因,嵌套层数太多,无法将加锁逻辑移动到事务外,因此考虑将方法 2 的事务传播级别设置为 REQUIRES_NEW,在方法 2 上开启一个新的事务,尽快提交插入的数据,如下图:

image-20240725211101248

代码改动如下

// 原代码
@Transactional// 新代码
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)

现象

事务传播机制改动为 REQUIRES_NEW 上线之后,数据出现问题,表现形式为部分数据未生成

经排查之后,定位到是这个注解的问题,将注解修改回滚就不会出现这种情况了

原因

这里修改了事务的传播机制,修改为了 REQUIRES_NEW ,而默认的传播机制为 PROPAGATION_REQUIRED

REQUIRES_NEW 传播机制会新建事务,无论当前是否存在事务,都会创建新的事务,新建的事务将和外层的事务没有任何关系,是两个独立的事务

那么这样的话,事务 2 确实可以更快地进行提交了,但是会导致他和事务 1 之间的数据隔离开来

而恰巧这里在事务 1 中插入了部分数据,在事务 2 中需要获取这些数据 ,但是由于两个事务隔离开,在事务 2 中读取不到事务 1 中未提交的数据,从而出现线上问题

思考

涉及到事务相关,思考两个点:

  • 通过加锁避免数据重复添加,但是如果外层存在事务,那么数据添加就不会立即生效,还是会存在重复添加数据的情况
  • 如果将事务的隔离级别由默认改为 REQUIRES_NEW ,会形成独立的事务,如果上层事务插入数据,该事务会读取不到,存在数据隔离的情况

因此,如果涉及到事务传播级别的修改,要考虑不同事务之间数据独立的问题!

可能解决的方案

自己想到一个解决的方案,可以通过编程式事务来解决,手动控制事务开始和提交,可以对事务的覆盖范围较清晰,减少出现问题的概率

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

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

相关文章

Java反射详细学习笔记

动态代理 特点 : 无侵入式的给代码增加额外的功能 ; 代理里面就是对象要被代理的方法 ; 通过接口保证,后面的对象和代理需要实现同一个接口 , 接口中就是被代理的所有方法 ; 如何为java对象创建一个代理 : java.lang.reflect.Proxy类 : 提供了为对象产生代理对象的…

【全面讲解下Docker in Docker的原理与实践】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 👉目录 👉前言👉原理👉实践👉安全和最佳实践👉前言 🦛…

linux shell(中)

结构化命令 if语句 if-then 最基本的结构化命令是 if-then 语句。if-then 语句的格式如下: if command thencommands ifif command; then # 通过把分号(;)放在待求值的命令尾部,可以将 then 语句写在同一行commands ifbash sh…

JAVA中的泛型机制详解

1.泛型的概念 java泛型是java5引入的一个特性,它允许我们为类,接口,方法指定类型参数,从而提供编译时类型安全检查。泛型的本质是参数化类型,即在声明类,接口或者方法时不指定具体的类型,而是使…

openEuler 安装 ROS2 Humble

openEuler 安装 ROS2 Humble 1 介绍2 安装【openEuler 24.03】2.1 Installing ros-humble2.2 Test ros-humble【python 版本冲突,未解决】 2 安装【openEuler 22.03】3 Python 版本问题【pyenv】参考 1 介绍 2 安装【openEuler 24.03】 2.1 Installing ros-humble…

FastApi接口限流

有个接口内容信息比较敏感,遂设置限流操作 通常的限流操作就包括对某个用户或者某个IP进行限流,每分钟或者每天最多能访问多少次之类的等等。FaslApi中的限流操作开源库SlowApi https://github.com/laurentS/slowapi 这个库是根据flask-limiter改编而来&…

力扣高频SQL 50题(基础版)第十三题

文章目录 力扣高频SQL 50题(基础版)第十三题570. 至少有5名直接下属的经理题目说明思路分析实现过程准备数据实现方式结果截图 力扣高频SQL 50题(基础版)第十三题 570. 至少有5名直接下属的经理 题目说明 表: Employee ------…

Java面试八股之后Spring、spring mvc和spring boot的区别

Spring、spring mvc和spring boot的区别 Spring, Spring Boot和Spring MVC都是Spring框架家族的一部分,它们各自有其特定的用途和优势。下面是它们之间的主要区别: Spring: Spring 是一个开源的轻量级Java开发框架,最初由Rod Johnson创建&…

MySQL零散拾遗(七)--- 突发奇想的一些疑虑

mysql中从2018-12-18提取出2018-12,如何实现 要在MySQL中从日期2018-12-18提取出2018-12,可以使用DATE_FORMAT()函数或者EXTRACT()函数。这两种方法都可以达到目的,下面是具体的实现方式: 使用 DATE_FORMAT() DATE_FORMAT()函数…

Ubuntu 20.04.5 LTS 编译 Android T(qcm8550 or rk3588)环境配置

Ubuntu 20.04.5 LTS 编译 Android T(qcm8550 or rk3588)环境配置: 参考文档: https://source.android.google.cn/docs/setup/start?hlzh-cn Android系统开发指导 https://developer.android.google.cn/studio/run/device?hlru USB 调试配置 https://b…

Linux之存储桶minio单机安装和使用简介

一、minio简介 MinIO 是一个高性能的分布式对象存储系统,主要用于存储非结构化数据,例如照片、视频、备份和日志文件。它是开源的,基于 Go 语言开发,具有高度可扩展性和高可用性,能够在私有云、公有云和边缘环境中部署…

20240725项目的maven环境报红-重新配置maven

1.在编辑器里面打开项目,导入源码 (1)找到项目的地址C:\Users\zzz\IdeaProjects\datasys,然后右击用idea编辑器打开。 (2)idea中上菜单栏打开open,然后输入file,选择源代码文件 2.…

LabVIEW放大器自动测量系统

开发了一个基于LabVIEW平台的多路前置放大器自动测量系统的开发与实施。该系统集成了硬件控制与软件编程,能够实现放大器各项性能指标的快速自动测量,有效提高了测试的精确性和效率。系统设计采用了虚拟仪器技术,结合了先进的测量与控制策略&…

.net core 外观者设计模式 实现,多种支付选择

1&#xff0c;接口 /// <summary>/// Web页面支付/// </summary>public interface IWebPagePay{public WebPagePayResult CreatePay(string productName, string orderSn, string totalPrice);}2&#xff0c;实现接口 实现阿里支付 public class AliPagePay : IWe…

Linux的TERM环境变量

程序或者脚本驱动登录到Linux系统之后。执行命令或者脚本&#xff0c;其返回值中往往出现格式异常。原因则在于虚拟终端类型的高级特性&#xff0c;例如&#xff1a;“颜色、高亮、移动光标”等。那么&#xff0c;是否禁掉这些高级特性呢&#xff1f;可以选择dumb类型&#xff…

丹东纵横文化传媒:创新引领,广告服务再升级

近日,丹东市振兴区的丹东纵横文化传媒有限公司再次传来振奋人心的消息,这家以互联网和相关服务为主的新兴企业,在广告设计与传播领域实现了重大突破,进一步巩固了其在行业内的领先地位。 【广告服务全面升级,引领市场新风尚】 据丹东纵横文化传媒有限公司最新发布的信息显示,公…

掌握AJAX技术:从基础到实战

文章目录 **引言****1. 什么是AJAX&#xff1f;****2. AJAX的工作原理**AJAX 示例使用 Fetch API 实现 AJAX **3. 如何在项目中使用AJAX****4. 处理AJAX请求的常见问题****5. AJAX与JSON的结合****6. 使用AJAX框架和库****7. 实战&#xff1a;创建一个动态表单****8. AJAX中的事…

spine to unity-2.利用边缘框实现实时碰撞检测

主要讲spine的边缘框&#xff0c;在unity中&#xff0c;实现实时碰撞检测。其中使用的素材&#xff0c;是我为独立游戏ink制作的动画。独立游戏ink的开发日志&#xff0c;在小红薯持续更新中。spine工具包的安装&#xff0c;下载请参考spine to unity-1spine BoundingBoxFollow…

Doris全方位教程+应用实例

Impala性能稍领先于presto,但是presto在数据源支持上非常丰富&#xff0c;包括hive、图数据库、传统关系型数据库、Redis等 缺点&#xff1a;这两种对hbase支持的都不好&#xff0c;presto 不支持&#xff0c;但是对hdfs、hive兼容性很好&#xff0c;其实这也是顺理成章的&…

mac怎样清理photoshop垃圾的方法 ps清理缓存和垃圾 苹果电脑暂存盘已满怎么清理

很多使用过ps&#xff0c;尤其是Adobe全家桶的小伙伴会发现&#xff0c;这些软件占用缓存很多&#xff0c;而且随着使用时间的增长&#xff0c;缓存也会越多&#xff0c;并不会自动清理。那么mac系统怎么清理ps暂存盘呢&#xff1f;mac又该怎么最高效清理磁盘空间呢&#xff1f…