Java多线程、高并发秒杀时MySQL出现死锁原因(Deadlock found when trying to get lock)及对应解决方案
1. 死锁背景
1.1 在做高并发秒杀中创建订单、减库存步骤时出现异常:MySQLTransactionRollbackException: Deadlock found when trying to get lock,也就是出现了死锁。
1.2 我们在学多线程时,知道死锁发生在两个线程互相去抢占对方的锁情况,如下图。
1.3 那我们这边出现死锁的原因是什么呢?出现死锁的原因有很多,比如相同记录行锁、索引锁以及GAP锁,我这边应该算是索引锁。在秒杀时,将创建订单、扣减商品库存放在了一个事务中,并且订单表中用到了商品表id作为外键,这个作为外键是关键,因为外键是一种索引,操作时会进行相应的加锁操作,导致发生死锁。
2. 死锁复现
2.1 使用MySQL客户端或命令行窗口,打开两个MySQL连接,我这边使用SQLyog,先使用 set @@autocommit=0; 关闭事务自动提交,并使用 select @@autocommit; 查看结果是否为0,为0则禁止成功,如下图。
2.2 我这边已经创建好了商品表以及订单表,你那边可以随便创建两个简单点的表,唯一要设置的就是其中一个表的主键id是另一个表的外键即可。
2.3 在MySQL连接A中插入一条订单数据,如下图。
2.4 接着在另一个MySQL连接B插入另一条订单数据,如下图。
2.5 接着返回MySQL连接A更新商品库存,如下图。
2.6 接着去MySQL连接B更新商品库存,如下图,也是等待并且最后等待超时。
2.7 先在两个连接都执行 rollback;回滚取消我们之前的操作,然后再执行2.3和2.4,接着在MySQL连接A执行库存更新语句,此时会处于等待状态,我们去另一个MySQL连接B执行库存更新语句,此时会有死锁提示,结果如下图。
3 死锁发生原因
我这边死锁原因大致是秒杀订单表中用到了商品表id作为外键导致索引锁,最终出现了死锁。
4. 死锁解决
4.1 取消外键索引
4.2 将订单创建和库存扣减顺序进行切换,先减库存,后创建订单。
4.3 避免多线程操作,可以将多个操作放入队列,一个一个进行处理。
Java多线程、高并发秒杀时MySQL出现死锁原因(Deadlock found when trying to get lock)及对应解决方案相关推荐
- 【在线网课】Java高性能高并发秒杀系统方案优化实战
java教程视频讲座简介: Java高性能高并发秒杀系统方案优化实战 Java秒杀系统方案优化 高性能高并发实战 以"秒杀"这一Java高性能高并发的试金石场景为例,带你通过一系列 ...
- Java解决高并发秒杀商品
在看本文章之前,需要了解Spring boot搭建和使用 ,本篇文章核心问题是如何解决高并发问题. 开发环境:redis缓存4.0.1,Rabbitmq消息队列,Erlang(这个跟MQ环境有关,先安 ...
- Java多线程高并发学习笔记(一)——ThreadRunnable
进程与线程 首先来看百度百科关于进程的介绍: 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动.它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体.它不只是程序的代码,还包括当前的 ...
- Java 实现高并发秒杀
1 需求分析和技术难点: 1.1 分析: 秒杀的时候:减少库存和购买记录明细两个事件保持在同一个事物中. 使用联合查询避免同一用户多次秒杀同一商品(利用在插入购物明细表中的秒杀id和用户的唯一标识来避 ...
- 「高并发秒杀」mysql只修改字段名称
高并发架构 消息队列 搜索引擎 缓存 分库分表 读写分离 设计高并发系统 高并发架构部分内容 缓存: Redis高可用: 高并发系统设计: 分布式系统 分布式业务系统,就是把原来用 Java 开发的一 ...
- 「高并发秒杀」mysql数据库引擎区别
一.秒杀系统架构设计都有哪些关键点? 二.设计秒杀系统时应该注意的5个架构原则 架构原则:"4要1不要" 1.1.数据要尽里少 1.2. 请求数要尽里少 1.3.路径要尽里短 1. ...
- 理解Java多线程高并发Executor框架的使用
Executor Executor 管理多个异步任务的执行,而无需程序员显式地管理线程的生命周期.这里的异步是指多个任务的执行互不干扰,不需要进行同步操作. Executor框架和其扩展接口Execu ...
- MySQL 数据库死锁问题-Deadlock found when trying to get lock
数据库死锁问题
- SpringBoot实现Java高并发秒杀系统之DAO层开发(一)
SpringBoot实现Java高并发秒杀系统之DAO层开发(一) 秒杀系统在如今电商项目中是很常见的,最近在学习电商项目时讲到了秒杀系统的实现,于是打算使用SpringBoot框架学习一下秒杀系统( ...
最新文章
- python入门有基础-Python入门学习难吗,新手如何学习
- if the parser found inconsistent certificates on the files in the .apk.104
- 半导体对物联网之水与鱼的关系
- js 原型prototype继承模式
- Mysql 5.8 参数调优
- 深入理解lua的协程coroutine
- python爬虫消费者与生产者_Condition版生产者与消费者模式
- 使用named_mutex实现读写锁,实现进程之间读共享写独占
- python人脸识别源码_Python 抖音机器人,让你找到漂亮小姐姐
- ide中tomcat乱码_idea tomcat 乱码问题的解决及相关设置
- leetcode -- Search Insert Position
- jetty 找不到html页面,记一次jetty 404问题排查修复
- FTP连接成功但是无法显示目录的解决方式
- Tensorflow多输入模型构建以及Dataset数据构建
- js获取今天剩余时间_骚姿势获取无线路由器后台权限
- Java判断上海自来水来自海上_JavaAPI
- 各种github浏览器无法访问问题
- 手把手教你入门深度强化学习(附链接代码)
- 博弈论2:学会换位思考(弱劣势策略)
- 你知道自己究竟“想要”什么,又该如何“做到”吗?--《认知觉醒》读书笔记