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)及对应解决方案相关推荐

  1. 【在线网课】Java高性能高并发秒杀系统方案优化实战

    java教程视频讲座简介: Java高性能高并发秒杀系统方案优化实战 Java秒杀系统方案优化 高性能高并发实战 以"秒杀"这一Java高性能高并发的试金石场景为例,带你通过一系列 ...

  2. Java解决高并发秒杀商品

    在看本文章之前,需要了解Spring boot搭建和使用 ,本篇文章核心问题是如何解决高并发问题. 开发环境:redis缓存4.0.1,Rabbitmq消息队列,Erlang(这个跟MQ环境有关,先安 ...

  3. Java多线程高并发学习笔记(一)——ThreadRunnable

    进程与线程 首先来看百度百科关于进程的介绍: 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动.它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体.它不只是程序的代码,还包括当前的 ...

  4. Java 实现高并发秒杀

    1 需求分析和技术难点: 1.1 分析: 秒杀的时候:减少库存和购买记录明细两个事件保持在同一个事物中. 使用联合查询避免同一用户多次秒杀同一商品(利用在插入购物明细表中的秒杀id和用户的唯一标识来避 ...

  5. 「高并发秒杀」mysql只修改字段名称

    高并发架构 消息队列 搜索引擎 缓存 分库分表 读写分离 设计高并发系统 高并发架构部分内容 缓存: Redis高可用: 高并发系统设计: 分布式系统 分布式业务系统,就是把原来用 Java 开发的一 ...

  6. 「高并发秒杀」mysql数据库引擎区别

    一.秒杀系统架构设计都有哪些关键点? 二.设计秒杀系统时应该注意的5个架构原则 架构原则:"4要1不要" 1.1.数据要尽里少 1.2. 请求数要尽里少 1.3.路径要尽里短 1. ...

  7. 理解Java多线程高并发Executor框架的使用

    Executor Executor 管理多个异步任务的执行,而无需程序员显式地管理线程的生命周期.这里的异步是指多个任务的执行互不干扰,不需要进行同步操作. Executor框架和其扩展接口Execu ...

  8. MySQL 数据库死锁问题-Deadlock found when trying to get lock

    数据库死锁问题

  9. SpringBoot实现Java高并发秒杀系统之DAO层开发(一)

    SpringBoot实现Java高并发秒杀系统之DAO层开发(一) 秒杀系统在如今电商项目中是很常见的,最近在学习电商项目时讲到了秒杀系统的实现,于是打算使用SpringBoot框架学习一下秒杀系统( ...

最新文章

  1. python入门有基础-Python入门学习难吗,新手如何学习
  2. if the parser found inconsistent certificates on the files in the .apk.104
  3. 半导体对物联网之水与鱼的关系
  4. js 原型prototype继承模式
  5. Mysql 5.8 参数调优
  6. 深入理解lua的协程coroutine
  7. python爬虫消费者与生产者_Condition版生产者与消费者模式
  8. 使用named_mutex实现读写锁,实现进程之间读共享写独占
  9. python人脸识别源码_Python 抖音机器人,让你找到漂亮小姐姐
  10. ide中tomcat乱码_idea tomcat 乱码问题的解决及相关设置
  11. leetcode -- Search Insert Position
  12. jetty 找不到html页面,记一次jetty 404问题排查修复
  13. FTP连接成功但是无法显示目录的解决方式
  14. Tensorflow多输入模型构建以及Dataset数据构建
  15. js获取今天剩余时间_骚姿势获取无线路由器后台权限
  16. Java判断上海自来水来自海上_JavaAPI
  17. 各种github浏览器无法访问问题
  18. 手把手教你入门深度强化学习(附链接代码)
  19. 博弈论2:学会换位思考(弱劣势策略)
  20. 你知道自己究竟“想要”什么,又该如何“做到”吗?--《认知觉醒》读书笔记

热门文章

  1. 选择屏幕——按钮、单选复选框
  2. 更新Oracle的Date字段
  3. abap 如何去掉字符串前导0
  4. SAP:查找某个请求号的传输者是谁
  5. 2020癌症大数据分析,哪些癌症最要命?
  6. 2020前三季度各省市人均收入来了!看看你的家乡排第几?
  7. 外卖平台降费,能否成为“全村人的希望”?
  8. 罗永浩直播带货花落谁家?不止是价高者得之
  9. python源码编译 mingw_使用mingw32 在windows python26 下编译安装4suite-xml
  10. java的默认_java默认包的使用