• 动漫微视频:春天里的叮嘱与承诺 2019-10-11
  • 监管排查网销保险风险 严防P2P风险交叉传递 2019-09-15
  • 要想视力好,运动少不了(体坛观澜) 2019-09-15
  • 贪官的可恨之处,不在于他们的贪污、索贿、受贿、侵占国有资财,而在于他们相互勾结,打压、排挤积极认真为党、国家、民族、人民工作的好干部。向他们靠拢就被拉拢、腐蚀变 2019-08-06
  • 西安又添新地标 隋唐第一门明德门将“复活” 2019-07-29
  • 华谊兄弟市值半月蒸发50亿 股票激励能否提振股价 2019-07-29
  • 科研人员发现新型光合作用 2019-07-08
  • 人民网评:用法律致敬英雄烈士 2019-07-05
  • 《国家人文历史》文章精选 2019-07-05
  • 人民日报记者眼中的70年:用镜头记录中国 2019-07-02
  • 雄安新区落实中央环境保护督察“回头看”整改任务 2019-07-02
  • 天津正厅级干部赵建国涉嫌受贿被移送审查起诉 2019-06-27
  • 【欧姆龙OMRON】欧姆龙OMRON智能电子血压计家用全自动上臂式HEM 2019-06-27
  • 北京一官员借单位换楼贪污受贿31万 退赃获轻判 2019-06-25
  • 骆惠宁主持召开十一届省委全面深化改革领导小组第十五次会议 2019-06-22
  • 数据库

    时时彩ab对打套利办法:MySQL:死锁一例

    广告
    广告

    微信扫一扫,分享到朋友圈

    MySQL:死锁一例
    1 0

    欢迎关注我的专栏《深入理解MySQL主从原理 32讲》 
    具体可以点击:ttps://j.youzan.com/yEY_Xi 

    一、问题由来

    这是我同事问我的一个问题,在网上看到了如下案例,本案例RC RR都可以出现,其实这个死锁原因也不叫简单,我们来具体看看:

    构造数据
    CREATE database deadlock_test;use deadlock_test;CREATE TABLE `push_token` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `token` varchar(128) NOT NULL COMMENT 'push token',  `app_id` varchar(128) DEFAULT NULL COMMENT 'appid',  `deleted` tinyint(1) NOT NULL COMMENT '是否已删除 0:否 1:是',   PRIMARY KEY (`id`),   UNIQUE KEY `uk_token_appid` (`token`,`app_id`)) ENGINE=InnoDB AUTO_INCREMENT=3384 DEFAULT CHARSET=utf8 COMMENT='pushtoken表';insert into push_token (id, token, app_id, deleted) values(1,"token1",1,0); 
    操作数据
    s1(TRX_ID367661)s2(TRX_ID367662)s3(TRX_ID367663)
    begin; UPDATE push_token SET deleted = 1 WHERE token = ‘token1’ AND app_id = ‘1’;
    begin; DELETE FROM push_token WHERE id IN (1);
    begin; UPDATE push_token SET deleted = 1 WHERE token = ‘token1’ AND app_id = ‘1’;
    commit;
    Query OK, 0 rows affected (0.00 sec)Query OK, 1 row affected (17.32 sec)ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

    二、分析方法

    我使用的分析方法是把整个加锁的日志打印出来,当然需要用到我自己做了输出修改的一个版本,如下: 
    https://github.com/gaopengcarl/percona-server-locks-detail-5.7.22

    这个版本我打开了的日志记录参数如下:

    mysql> show variables like '%gaopeng%';+--------------------------------+-------+| Variable_name                  | Value |+--------------------------------+-------+| gaopeng_mdl_detail             | OFF   || innodb_gaopeng_row_lock_detail | ON    |+--------------------------------+-------+2 rows in set (0.01 sec) 

    这样大部分的innodb加锁记录都会记录到errlog日志了。好了下面我详细分析一下日志:

    三、分析过程

    初始化的情况整个表只有1条记录,本表包含一个主键和一个唯一键。

    • s1(TRX_ID367661) 执行语句
    begin;UPDATE push_token SET deleted = 1 WHERE token = 'token1' AND app_id = '1'; 

    日志输出:

    2019-08-18T19:10:05.117317+08:00 6 [Note] InnoDB: TRX ID:(367661) table:deadlock_test/push_token index:uk_token_appid space_id: 449 page_id:4 heap_no:2 row lock mode:LOCK_X|LOCK_NOT_GAP|PHYSICAL RECORD: n_fields 3; compact format; info bits 0 0: len 6; hex 746f6b656e31; asc token1;; 1: len 1; hex 31; asc 1;; 2: len 8; hex 8000000000000001; asc         ;;2019-08-18T19:10:05.117714+08:00 6 [Note] InnoDB: TRX ID:(367661) table:deadlock_test/push_token index:PRIMARY space_id: 449 page_id:3 heap_no:2 row lock mode:LOCK_X|LOCK_NOT_GAP|PHYSICAL RECORD: n_fields 6; compact format; info bits 0 0: len 8; hex 8000000000000001; asc         ;; 1: len 6; hex 000000059c2c; asc      ,;; 2: len 7; hex bf000000420110; asc     B  ;; 3: len 6; hex 746f6b656e31; asc token1;; 4: len 1; hex 31; asc 1;; 5: len 1; hex 80; asc  ;; 

    我们看到主键和唯一键都加锁了如下图:

    • s2(TRX_ID367662) 执行语句
    begin;DELETE FROM push_token WHERE id IN (1);` 

    日志输出:

    2019-08-18T19:10:22.751467+08:00 9 [Note] InnoDB: TRX ID:(367662) table:deadlock_test/push_token index:PRIMARY space_id: 449 page_id:3 heap_no:2 row lock mode:LOCK_X|LOCK_NOT_GAP|PHYSICAL RECORD: n_fields 6; compact format; info bits 0 0: len 8; hex 8000000000000001; asc         ;; 1: len 6; hex 000000059c2d; asc      -;; 2: len 7; hex 400000002a1dc8; asc @   *  ;; 3: len 6; hex 746f6b656e31; asc token1;; 4: len 1; hex 31; asc 1;; 5: len 1; hex 81; asc  ;;2019-08-18T19:10:22.752753+08:00 9 [Note] InnoDB: Trx(367662) is blocked!!!!! 

    这个时候S2需要获取主键上的锁,因此被堵塞了如下图:

    • s3(TRX_ID367663) 执行语句
    begin; UPDATE push_token SET deleted = 1 WHERE token = 'token1' AND app_id = '1';` 

    日志输出:

    019-08-18T19:10:30.822111+08:00 8 [Note] InnoDB: TRX ID:(367663) table:deadlock_test/push_token index:uk_token_appid space_id: 449 page_id:4 heap_no:2 row lock mode:LOCK_X|LOCK_NOT_GAP|PHYSICAL RECORD: n_fields 3; compact format; info bits 0 0: len 6; hex 746f6b656e31; asc token1;; 1: len 1; hex 31; asc 1;; 2: len 8; hex 8000000000000001; asc         ;;2019-08-18T19:10:30.918248+08:00 8 [Note] InnoDB: Trx(367663) is blocked!!!!! 

    这个时候S3需要获取唯一键上的锁,因此被堵塞了如下图:

    • s1(TRX_ID367661) 执行语句

    这一步完成后死锁出现。

    commit;

    日志输出如下:

    367663和367662各自获取需要的锁2019-08-18T19:10:36.566733+08:00 8 [Note] InnoDB: TRX ID:(367663) table:deadlock_test/push_token index:uk_token_appid space_id: 449 page_id:4 heap_no:2 row lock mode:LOCK_X|LOCK_NOT_GAP|PHYSICAL RECORD: n_fields 3; compact format; info bits 0 0: len 6; hex 746f6b656e31; asc token1;; 1: len 1; hex 31; asc 1;; 2: len 8; hex 8000000000000001; asc         ;;2019-08-18T19:10:36.568711+08:00 9 [Note] InnoDB: TRX ID:(367662) table:deadlock_test/push_token index:PRIMARY space_id: 449 page_id:3 heap_no:2 row lock mode:LOCK_X|LOCK_NOT_GAP|PHYSICAL RECORD: n_fields 6; compact format; info bits 0 0: len 8; hex 8000000000000001; asc         ;; 1: len 6; hex 000000059c2d; asc      -;; 2: len 7; hex 400000002a1dc8; asc @   *  ;; 3: len 6; hex 746f6b656e31; asc token1;; 4: len 1; hex 31; asc 1;; 5: len 1; hex 81; asc  ;;367663获取主键锁堵塞、367662获取唯一键锁堵塞,死锁形成2019-08-18T19:10:36.570313+08:00 8 [Note] InnoDB: TRX ID:(367663) table:deadlock_test/push_token index:PRIMARY space_id: 449 page_id:3 heap_no:2 row lock mode:LOCK_X|LOCK_NOT_GAP|PHYSICAL RECORD: n_fields 6; compact format; info bits 0 0: len 8; hex 8000000000000001; asc         ;; 1: len 6; hex 000000059c2d; asc      -;; 2: len 7; hex 400000002a1dc8; asc @   *  ;; 3: len 6; hex 746f6b656e31; asc token1;; 4: len 1; hex 31; asc 1;; 5: len 1; hex 81; asc  ;;2019-08-18T19:10:36.571199+08:00 8 [Note] InnoDB: Trx(367663) is blocked!!!!!2019-08-18T19:10:36.572481+08:00 9 [Note] InnoDB: TRX ID:(367662) table:deadlock_test/push_token index:uk_token_appid space_id: 449 page_id:4 heap_no:2 row lock mode:LOCK_X|LOCK_NOT_GAP|PHYSICAL RECORD: n_fields 3; compact format; info bits 0 0: len 6; hex 746f6b656e31; asc token1;; 1: len 1; hex 31; asc 1;; 2: len 8; hex 8000000000000001; asc         ;;2019-08-18T19:10:36.573073+08:00 9 [Note] InnoDB: Transactions deadlock detected, dumping detailed information. 

    这个时候我们看到s2和s3先是获取了各自需要的锁,s3获取主键锁堵塞,s2获取唯一键锁堵塞,死锁出现。如下图:

    好了我们看到了死锁就这样出现。

    我还没有学会写个人说明!

    分布式Redis深度历险-复制

    上一篇

    AI 数据中台 Mega 及其应用

    下一篇

    你也可能喜欢

    MySQL:死锁一例

    长按储存图像,分享给朋友

    ITPUB 每周精要将以邮件的形式发放至您的邮箱


    微信扫一扫

    微信扫一扫
  • 动漫微视频:春天里的叮嘱与承诺 2019-10-11
  • 监管排查网销保险风险 严防P2P风险交叉传递 2019-09-15
  • 要想视力好,运动少不了(体坛观澜) 2019-09-15
  • 贪官的可恨之处,不在于他们的贪污、索贿、受贿、侵占国有资财,而在于他们相互勾结,打压、排挤积极认真为党、国家、民族、人民工作的好干部。向他们靠拢就被拉拢、腐蚀变 2019-08-06
  • 西安又添新地标 隋唐第一门明德门将“复活” 2019-07-29
  • 华谊兄弟市值半月蒸发50亿 股票激励能否提振股价 2019-07-29
  • 科研人员发现新型光合作用 2019-07-08
  • 人民网评:用法律致敬英雄烈士 2019-07-05
  • 《国家人文历史》文章精选 2019-07-05
  • 人民日报记者眼中的70年:用镜头记录中国 2019-07-02
  • 雄安新区落实中央环境保护督察“回头看”整改任务 2019-07-02
  • 天津正厅级干部赵建国涉嫌受贿被移送审查起诉 2019-06-27
  • 【欧姆龙OMRON】欧姆龙OMRON智能电子血压计家用全自动上臂式HEM 2019-06-27
  • 北京一官员借单位换楼贪污受贿31万 退赃获轻判 2019-06-25
  • 骆惠宁主持召开十一届省委全面深化改革领导小组第十五次会议 2019-06-22
  • 排列3技巧规律 七星彩大数据分析软件今晚 一个骰子比大小规则 体彩排三六码最大遗漏 广东时时平台代理 北京pk10全天6码计划 p62今日开奖号 云南时时的台子 一分钟快三大小单双回血技巧 飞艇赛车pk10直播 捕鱼app作弊 2019女篮比赛赛程 胆拖中奖计算器十一选五复式投注表 分分彩计划软件安卓版 福建时时开奖直播 天天计划软件手机版