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

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

搜索
热门搜索: 健康 瑜伽 养生
 找回密码
 立即注册
热图推荐
  • 我家简简单单刷大白墙,装修花了不到7W,邻
  • 北京故宫博物院珍宝馆(六)紫禁城中颜值造
  • 【关注】18岁学生被埋大黑石沙滩,6名嫌疑
  • ISIS疑被彻底消灭,最后战斗过程极为惨烈,
  • Java搭建web服务器之Socket编程,更好的理
  • 给力!这个县人武部优先落实退役军人优抚安
  • 饭店吃饭时,这3种蔬菜最好不要点,服务员
  • 中石油38天3人落马:他和“西北虎”搭过班
  • 最大败笔交易诞生!猛龙弃将场均26+15制霸
  • 吃山竹好吗?有哪些禁忌?这3个禁忌或许是
查看: 696|回复: 0

阻止能量传导 mysql数据库死锁实验模拟演示 2012最新婚纱样片

[复制链接]

962

主题

1036

帖子

2534

积分

金牌会员

Rank: 6Rank: 6

积分
2534
发表于 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
  • 扫描二维码加关注

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