请选择 进入手机版 | 继续访问电脑版

爱久养身园-大众养生网-中华养生网-2213养生网-养生之道网-提供让人人平安的健康保健,疾病防护,营养师问答和食谱

搜索
热门搜索: 健康 瑜伽 养生
 找回密码
 立即注册
热图推荐
  • 七个摄影小技巧,助你学好摄影
  • 古代城池内部设施,商肆、集市、空场分别设
  • 双线争冠连遇最强阻击!战完巴萨,利物浦英
  • 奔驰G牧马人有新伙伴,让路虎发现往边站的
  • 美国微型跨界车市场潜力可观 竞争也日趋激
  • 为何顶级专家不推荐牛奶——牛奶神话的破灭
  • 4种营养对猫皮毛很重要,猫的皮毛状况与饮
查看: 706|回复: 0

带种来爱我 mysql数据库死锁实验模拟演示 超限第一战

[复制链接]

1349

主题

1423

帖子

3695

积分

论坛元老

Rank: 8Rank: 8

积分
3695
发表于 2019-6-14 07:01 | 显示全部楼层 |阅读模式
概述
之前接触到的数据库死锁,很多都是批量更新时加锁顺序不一致而导致的死锁,但是上周却遇到了一个很难理解的死锁。借着这个机会又重新学习了一下mysql的死锁知识以及常见的死锁场景。今天不介绍死锁的基本知识和mysql的加锁原理,主要是用实验来帮助大家理解下死锁。
<h1>环境

环境:采用的是5.7版本的mysql数据库,事务隔离级别是默认的RR(Repeatable-Read),采用innodb引擎。
<h1>环境演示


DXCPICKPRE_0</pre>


表的结构很简单,一个主键id,另一个唯一索引a。表里的数据如下:

DXCPICKPRE_1</pre>


出现死锁的操作如下:




然后通过SHOW ENGINE INNODB STATUS G;来查看死锁日志:








分析
遇到死锁,第一步就是阅读死锁日志。死锁日志通常分为两部分,上半部分说明了事务1在等待什么锁:

DXCPICKPRE_2</pre>从日志里我们可以看到事务1(MySQL thread id 372)和事务2(MySQL thread id 371)产生了死锁。
查看thread


查看死锁

DXCPICKPRE_3</pre>


该锁是通过事务2在步骤2执行的delete语句申请的。由于是RR隔离模式下的基于唯一索引的等值查询(Where a = 2),所以会申请一个记录锁,而非next-key锁。
而且事务2正在申请S锁,也就是共享锁。该锁是insert into test (id,a) values (10,2)语句申请的。insert语句在普通情况下是会申请排他锁,也就是X锁,但是这里出现了S锁。这是因为a字段是一个唯一索引,所以insert语句会在插入前进行一次duplicate key的检查,为了使这次检查成功,需要申请S锁防止其他事务对a字段进行修改。
那么为什么该S锁会失败呢?这是对同一个字段的锁的申请是需要排队的。S锁前面还有一个未申请成功的X锁,所以S锁必须等待,所以形成了循环等待,死锁出现了。
<h1>死锁形成流程图

这里通过表格的形式阐述死锁形成的流程:


后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下!

感谢您的阅读

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

    联系我们
  • 咨询电话:0000 - 12345678 9999888877
  • 邮箱:123456789@qq . com
  • 地址:北京市海定区通州路群芳园二园1号楼9号
    移动客户端:
    关注我们:
  • 微信公众号:
  • 123cwyy
  • 扫描二维码加关注

快速回复 返回顶部 返回列表