Transcational与Synchronized或Lock搭配使用导致并发问题

news2025/1/16 2:55:48

在多线程的情况下,我们经常会用到synchronized或者Lock来保证我们的线程安全。
但是当碰到Transcational之后又会碰撞出什么火花呢?

相信我,看完之后,你一定不会亏

首先回顾一下小知识点:
基于@Transactional注解的是 声明式事务
spring还提供了另外一种创建事务的方式,即通过手动编写代码实现的事务,我们把这种事务叫做:编程式事务。

数据库连接本来默认是自动提交的,加上注解Transactional之后,会设置为手动提交。
自动提交意味着 每当我们执行一个update ,delete或者insert的时候都会自动提交到数据库,无法回滚事务。

下面我们来看一个例子:
在这里插入图片描述
这个方法的执行流程是这样的。
在这里插入图片描述
很显然,涉及库存和订单,都会对数据库进行操作,且应该是应该原子性的操作。

所以我们在方法上加了一个 @Transactional 注解。

在这里插入图片描述

接着我们用Jmeter进行并发测试 15个线程 抢购数据库现有的10个库存。
在这里插入图片描述
执行完之后,我们发现本来10台库存,现在15个人居然都抢到了,还剩了2台。
真是离谱Mother给离谱开门,离谱到家了。此刻我真的想说,I love you Mother。

在这里插入图片描述

本来我们想象的执行流程应该是这样的:
在这里插入图片描述

造成现在超卖这种情况,只能说明我们的执行流程是这样的。
在这里插入图片描述

原因就在于,加上Transactional 之后,代码执行顺序变成了,先执行开启了事务,然后在上锁。最后的时候先解锁,然后提交事务。
在解锁和提交事务这个间隙中,使得其他线程有了趁虚而入的机会。上一个线程还没提交事务呢,下一个线程已经进来了,并且读取到的库存数量还是上一个线程修改之前的库存量。

所以,正确的使用锁:把整个事务放在锁的工作范围之内。即在进入事务方法之前就加上锁。

因此,我们可以这样解决:
在这里插入图片描述
想这样解决的朋友,回去等通知吧。赶紧去搜一下事务失效的几种场景

正常使用的话,可以这样:
第一种:
新建一个service,将之前lock锁之后的代码逻辑,放到另外一个service方法当中,然后再进行调用。
在这里插入图片描述

第二种:自己注入自己的方式
在这里插入图片描述

同样的,如果使用synchronized的话,也会出现同样的问题。
解决方案参考上面的方式,也可以这样。
在这里插入图片描述
参考文章 歪歪大神 https://juejin.cn/post/6999476143699001352#heading-3

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

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

相关文章

4.R语言【dplyr包】使用方法

b站课程视频链接: https://www.bilibili.com/video/BV19x411X7C6?p1 腾讯课堂(最新,但是要花钱,我花99😢😢元买了,感觉讲的没问题,就是知识点结构有点乱,有点废话)&…

黑马程序员Java教程学习笔记(二)

学习视频:https://www.bilibili.com/video/BV1Cv411372m 如侵权,请私信联系本人删除 文章目录黑马程序员Java学习笔记(二)数组概述数组定义方式一、访问、注意事项数组定义方式二,元素默认值规则数组遍历、元素求和数组…

HTML5+CSS3小实例:文本背景扫光效果

实例:文本背景扫光效果 技术栈:HTML+CSS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content="width…

【OpenGL学习】OpenGL环境配置

OpenGL环境配置 为了能够定义OpenGL上下文和创建用于显示的窗口&#xff0c;我们首先需要配置一些库来帮助我们实现&#xff0c;当前比较流行的用于创建窗口的库有GLUT&#xff0c;SDL&#xff0c;SFML和GLFW&#xff0c;其中网上的大部分教程使用的都是GLFW&#xff0c;因此我…

聊聊Pytorch2.0的新特性

一句话概括下&#xff0c;Pytorch2.0的功能介绍核心就是&#xff1a;torch.compile opt_module torch.compile(module)一行代码就能优化你的模型&#xff0c;优化后的模型和往常使用方式一样 速度会提升&#xff0c;比较重要的一点是&#xff1a;可以用于训练或者部署&#…

Grafana 告警接入飞书通知

Grafana 系列文章&#xff0c;版本&#xff1a;OOS v9.3.1 Grafana 的介绍和安装Grafana监控大屏配置参数介绍&#xff08;一&#xff09;Grafana监控大屏配置参数介绍&#xff08;二&#xff09;Grafana监控大屏可视化图表Grafana 查询数据和转换数据Grafana 告警模块介绍Graf…

带你从源码中分析关于vue(v2.7.10)的面试题

我们在面试的时候经常会被问到vue框架的原理类问题&#xff0c;我今天整理了一些常见问题和答案&#xff0c;希望有不正确之处还请指正。 1.new Vue时发生了什么 首先实例化一个对象&#xff0c;该对象执行init方法初始化生命周期等等&#xff0c;随后执行$mount方法开始生成v…

Modbus Slave缓冲区溢出漏洞CVE-2022-1068分析与复现

漏洞概述Modbus Slave是一个模拟工业领域通信协议Modbus从站的上位机软件&#xff0c;主要用于测试和调试Modbus从设备。该软件7.4.2以及以前的版本&#xff0c;在注册时&#xff0c;未对注册码长度进行安全检查&#xff0c;存在缓冲区溢出漏洞&#xff0c;导致软件崩溃。影响范…

在 Kubernetes 中部署并使用 KubeEdge

作者&#xff1a;马伟&#xff0c;青云科技容器顾问&#xff0c;云原生爱好者&#xff0c;目前专注于云原生技术&#xff0c;云原生领域技术栈涉及 Kubernetes、KubeSphere、KubeKey 等。 边缘计算在广泛制造业、工业、零售和金融等行业&#xff0c;随着云原生应用的兴起&#…

UDS诊断系列介绍07-2E服务

本文框架1. 系列介绍2E服务概述2. 2E服务请求与应答2.1 2E服务请求2.2 2E服务肯定响应2.3 2E服务否定应答3. Autosar系列文章快速链接1. 系列介绍 UDS&#xff08;Unified Diagnostic Services&#xff09;协议&#xff0c;即统一的诊断服务&#xff0c;是面向整车所有ECU的一…

Webpack打包图片-JS-Vue文件

打包图片等静态资源 资源模块 | webpack 中文文档 (docschina.org) 1、加载图片案例准备 为了演示我们项目中可以加载图片&#xff0c;我们需要在项目中使用图片&#xff0c;比较常见的使用图片的方式是两种&#xff1a; img元素&#xff0c;设置src属性&#xff1b;其他元…

基于Java jsp+mysql+Spring的汽车出租平台租赁网站平台设计和实现

基于Java jspmysqlSpring的汽车出租平台租赁网站平台设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 …

蓝队攻击的四个阶段(二)

目录 一&#xff0c;漏洞利用工具 (1)WebLogic 全版本需洞利用工具 (2)Struts2 综合漏洞利用工具 (3)sqlmap 注入工具 (4)vSphere Client RCE 漏洞(CVE-2021-21972)利用工具 (5)Windows Print Spooler 权限提升漏洞(CVE-2021-1675) (6)Exchange Server漏洞组合利用(CVE-2…

JVM-【面试题】-带你了解对象的创建过程

本文介绍对象在jvm的创建过程该图是对象在jvm的创建过程一、类加载检查虚拟机遇到一条new指令时&#xff0c;首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有&#xff0c;那…

图机器学习-图机器学习传统方法

图机器学习-图机器学习传统方法 最近在学习一些GNN相关的知识&#xff0c;想写一些笔记记录一下自己的学习过程&#xff0c;主要的学习资料为CS224W课程主页上面的资料和b站同济子豪兄的中文讲解。这篇博客是我2023年的第一篇博客&#xff0c;想以图机器学习中的传统方法作为博…

项目管理工具dhtmlxGantt甘特图入门教程(八):数据加载(三)

dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表&#xff0c;可满足项目管理控件应用程序的所有需求&#xff0c;是最完善的甘特图图表库。 这篇文章给大家讲解如何利用 dhtmlxGantt正确保存和显示任务的结束日期&#xff0c;本节将给你一个明确答案。 Dht…

异常-捕获业务异常踩坑记录

事情是这样&#xff0c;用了google的一个本地缓存框架&#xff0c;就是在查询数据的时候如果有就取缓存&#xff0c;没有就发http请求调接口&#xff0c;但是http请求也会有查询失败的时候&#xff0c;查询失败就会手动抛一个业务异常&#xff0c;然后我会在外层各种捕获异常&a…

三消游戏查找算法的原理和实现

本文首发于公众号&#xff1a; 小蚂蚁教你做游戏。欢迎关注领取更多学习做游戏的原创教程资料&#xff0c;每天学点儿游戏开发知识。嗨&#xff01;大家好&#xff0c;我是小蚂蚁。今天这篇文章分享一下三消查找算法的原理和实现&#xff0c;其实三消的机制最早源于《宝石方块》…

无联不成春,2023创宇网安春联展!

春 联 又叫“春贴”“门对”“对联” 它以对仗工整、简洁精巧的文字 描绘美好形象&#xff0c;寄托美好愿望 是中国独特的文学形式 网络安全的列车已驶入2023&#xff0c;癸卯兔年新春将至&#xff01; 热爱中华优秀传统文化的创宇人&#xff0c;也纷纷以春联为载体&…

大网进阶安全刷题讲解(带答案)(1)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.大网进阶安全刷题 前言 本章将会讲解大网进阶安全刷题讲解。 一.大网进阶…