设为首页 收藏本站
查看: 659|回复: 0

[经验分享] mysql 死锁记录

[复制链接]

尚未签到

发表于 2018-10-7 10:47:55 | 显示全部楼层 |阅读模式
  测试环境: mysql 5.7.18     RR隔离级别
DSC0000.png

  创建表,插入部分测试数据
  CREATE TABLE yhtest (
  a INT (11) NOT NULL AUTO_INCREMENT,
  b INT (11) DEFAULT NULL,
  c INT (11) DEFAULT NULL,
  PRIMARY KEY (a),
  unique key(b)
  ) ENGINE = INNODB ;
  INSERT INTO yhtest VALUE (1, 1, 1),
  (2, 2, 2),
  (3, 3, 3),
  (4, 4, 4),
  (5, 5, 5),
  (6, 6, 6),
  (7, 7, 7),
  (8, 8, 8),
  (9, 9, 9),
  (10, 10, 10),
  (11, 11, 11) ;
  操作:
  事物1:begin;
  事物2:begin;
  事物1:delete from yhtest where a=2;    可以执行
  事物2:delete from yhtest where a=3;    可以执行
  事物1:delete from yhtest where a=4;     可以执行
  事物2:delete from yhtest where a=5;    可以执行
  事物1:insert into yhtest value(2,2,2);     锁等待,待事物2回滚后,可以执行
  事物2: insert into yhtest value(3,3,3);    报出死锁,回滚,如下:
DSC0001.png

  死锁日志:
  ------------------------
  LATEST DETECTED DEADLOCK
  ------------------------
  2017-10-27 19:38:00 0x7f4b67932700
  *** (1) TRANSACTION:
  TRANSACTION 3914, ACTIVE 117 sec inserting
  mysql tables in use 1, locked 1
  LOCK WAIT 6 lock struct(s), heap size 1136, 7 row lock(s), undo log entries 3

  MySQL thread>  insert into yhtest value(2,2,2)
  *** (1) WAITING FOR THIS LOCK TO BE GRANTED:

  RECORD LOCKS space>  Record lock, heap no 4 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
  0: len 4; hex 80000003; asc     ;;
  1: len 4; hex 80000003; asc     ;;
  *** (2) TRANSACTION:
  TRANSACTION 3919, ACTIVE 93 sec inserting
  mysql tables in use 1, locked 1

  6 lock struct(s), heap>
  MySQL thread>  insert into yhtest value(3,3,3)
  *** (2) HOLDS THE LOCK(S):

  RECORD LOCKS space>  Record lock, heap no 4 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
  0: len 4; hex 80000003; asc     ;;
  1: len 4; hex 80000003; asc     ;;
  *** (2) WAITING FOR THIS LOCK TO BE GRANTED:

  RECORD LOCKS space>  Record lock, heap no 5 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
  0: len 4; hex 80000004; asc     ;;
  1: len 4; hex 80000004; asc     ;;
  *** WE ROLL BACK TRANSACTION (2)
  通过innodb日志可以看出,
  事物1执行  insert into yhtest value(2,2,2);  时,会等待b列索引b=3 上的S锁被添加,b=3 这一行因为被事物2执行了 delete from yhtest where a=3;  排他锁锁住, S锁等待正常。
  事物2执行   insert into yhtest value(3,3,3); 时,可以看出其持有b=3 的X锁, 等待 b=4 上的S锁被添加,b=4 这一行 因为被事物1执行了delete from yhtest where a=4; 排他锁锁住,S锁等待, 这时候,事物1和事物2互相等待对方持有的锁资源,形成回环,死锁出现
  这里事物1 插入(2,2,2) 和事物2插入(3,3,3) 因为b列的唯一键存在,需要进行唯一键校验,而由于在之前已经进行了该列删除,需要通过锁定下一列判断b=2 的唯一性,b=3的唯一性,而这两列的锁已经被对方持有,故出现死锁。
  这种死锁情况,在RC隔离级别下同样会出现!


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-614249-1-1.html 上篇帖子: mysql主从复制的步骤 下篇帖子: mysql 5.6 在线DDL-mysql大数据实战
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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