<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
隨著我被拉入一個新的群聊“生產環境死鎖問題排查解決”,打破了午後的悠然愜意,點開群聊秒送了一個648超級大禮包(業務不正常,死鎖異常紀錄檔輸出),領導怒斥並要求趕緊排除解決並總結經驗,剛好我略懂略懂一點MySQL鎖知識,這不得秀一下自己的實力
既然死鎖已經發生,也完全不要慌啊,按我說著做,一定能找到原因然後解決
觸發下面這條命令獲取到線索
SHOW ENGINE INNODB STATUS;
執行後你會得到一段讓人看了有點迷迷的死鎖紀錄檔,具體我們該怎麼分析死鎖,可以分成一下三步
由於死鎖紀錄檔過於長,下面的紀錄檔只擷取部分有用的記錄
------------------------ LATEST DETECTED DEADLOCK ------------------------ 2022-10-14 15:51:34 0x1a00 發生死鎖的事務(一) *** (1) TRANSACTION: TRANSACTION 32828384, ACTIVE 0 sec fetching rows mysql tables in use 1, locked 1 LOCK WAIT 12 lock struct(s), heap size 1128, 285 row lock(s) MySQL thread id 26352, OS thread handle 8548, query id 987590925 WIN-6Q9NIAJLCDR 172.27.15.57 swgj updating 事務(一)導致死鎖的sql update xxx SET STATUS = '2', DESCRIPTION = 'xxx', MODIFY_TIME = '2022-10-14 15:51:35.707' WHERE BATCH_NO = 'xxx' and SFSB = '1' 事務(一)持有的鎖 *** (1) HOLDS THE LOCK(S): RECORD LOCKS space id 8575 page no 82 n bits 104 index PRIMARY of table `swgj`.`spgl_xmspsxblxxxxb` trx id 32828384 lock_mode X 事務(一)持有鎖的資料記錄資訊 (supremum虛擬最大記錄) Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0 0: len 8; hex 73757072656d756d; asc supremum;; 事務(一)持有鎖的資料記錄資訊 (哪一行資料被鎖了) Record lock, heap no 2 PHYSICAL RECORD: n_fields 29; compact format; info bits 0 0: len 30; hex 30663730333038302d313164662d346439642d626338662d393439333333; asc 0f703080-11df-4d9d-bc8f-949333; (total 36 bytes); 1: len 6; hex 0000015129e1; asc Q) ;; 2: len 7; hex 010000402103cd; asc @! ;; 3: len 6; hex 313635303036; asc 165006;; ..... ..... 事務(一)等待的鎖 *** (1) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 8575 page no 37 n bits 112 index PRIMARY of table `swgj`.`spgl_xmspsxblxxxxb` trx id 32828384 lock_mode X waiting 事務(一)等待鎖的資料記錄資訊 Record lock, heap no 45 PHYSICAL RECORD: n_fields 29; compact format; info bits 0 0: len 30; hex 32643736613832362d343763362d343861332d613038662d343539333061; asc 2d76a826-47c6-48a3-a08f-45930a; (total 36 bytes); 1: len 6; hex 000001f4ebdd; asc ;; 2: len 7; hex 820000402b3c96; asc @+< ;; 3: SQL NULL; ..... ..... 發生死鎖的事務(二) *** (2) TRANSACTION: TRANSACTION 32828381, ACTIVE 5 sec inserting mysql tables in use 1, locked 1 LOCK WAIT 125 lock struct(s), heap size 24696, 137 row lock(s), undo log entries 724 MySQL thread id 26357, OS thread handle 12700, query id 987590958 WIN-6Q9NIAJLCDR 172.27.15.57 swgj update 事務(二)導致死鎖的sql insert into xxx ( ID, BATCH_NO, DFSJZJ,... ) values ( 'xxx', 'xxx','xxx' ) 事務(二)持有的鎖 *** (2) HOLDS THE LOCK(S): RECORD LOCKS space id 8575 page no 37 n bits 112 index PRIMARY of table `swgj`.`spgl_xmspsxblxxxxb` trx id 32828381 lock_mode X locks rec but not gap 事務(二)持有鎖的資料記錄資訊 Record lock, heap no 45 PHYSICAL RECORD: n_fields 29; compact format; info bits 0 0: len 30; hex 32643736613832362d343763362d343861332d613038662d343539333061; asc 2d76a826-47c6-48a3-a08f-45930a; (total 36 bytes); 1: len 6; hex 000001f4ebdd; asc ;; 2: len 7; hex 820000402b3c96; asc @+< ;; 3: SQL NULL; ... ... 事務(二)等待的鎖 *** (2) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 8575 page no 82 n bits 104 index PRIMARY of table `swgj`.`spgl_xmspsxblxxxxb` trx id 32828381 lock_mode X locks gap before rec insert intention waiting 事務(二)等待鎖的資料記錄資訊 Record lock, heap no 3 PHYSICAL RECORD: n_fields 29; compact format; info bits 0 0: len 30; hex 30666435313133662d393462382d346636632d383362372d303463656536; asc 0fd5113f-94b8-4f6c-83b7-04cee6; (total 36 bytes); 1: len 6; hex 000001dbb470; asc p;; 2: len 7; hex 020000013619a1; asc 6 ;; 3: len 6; hex 313636333830; asc 166380;; ... ...
從資料庫版本5.7、事務的隔離級別 REPEATABLE READ
官方檔案明確指出在 REPEATABLE READ 隔離級別下,預設查詢條件下是加 next-key locks (record locks + gap locks ) 或 gap locks,當查詢條件使用了唯一索引時,只會對當前查詢的唯一記錄進行加鎖,此時鎖為 record locks
官方檔案強勢佔位
從死鎖紀錄檔資訊可以得出
接下來我將用一個小例子來複現這次死鎖現象
CREATE TABLE `dead_lock` ( `id` varchar(10) NOT NULL, `batch_no` varchar(10) DEFAULT NULL, `status` varchar(1) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO dead_lock (id,batch_no,status) VALUES ('10','1','1'), ('20','20','1'), ('30','30',NULL), ('32','32',NULL);
begin; insert into dead_lock values ('34', '34', null);
begin; update dead_lock set status = '1' where batch_no = '20';
insert into dead_lock values ('11', '11', null);
在 MySQL 事務隔離級別 REPEATABLE READ 的情況下,對於 update,delete 等操作語句,查詢條件儘量使用索引,減少鎖的範圍,提高寫的並行量,避免不必要的死鎖發生影響業務正常執行
這次死鎖的說明就到這裡,希望大家能看得懂並有所收穫,不得不說有些知識我是略過了,大家可以自行檢視官方檔案補充瞭解,更多關於update where無索引MySQL死鎖的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45