鎖日志輸出參考八怪大神
版本:Percona MySQL 5.7.22
對(duì)于鎖的學(xué)習(xí)我做了一些輸出詳細(xì)參考如下:
https://github.com/gaopengcarl/percona-server-locks-detail-5.7.22.git
其中有readme
問(wèn)題列表
- 事務(wù)1拿到X鎖火架,事務(wù)2申請(qǐng)X鎖,事務(wù)1在申請(qǐng)S鎖會(huì)阻塞么
- replace into為什么死鎖
接下來(lái)我們做兩個(gè)實(shí)驗(yàn)赡若,驗(yàn)證問(wèn)題
表結(jié)構(gòu)
CREATE TABLE `tmp` (
`id` int(11) NOT NULL,
`code` int(11) DEFAULT NULL,
`name` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
表數(shù)據(jù)
實(shí)驗(yàn)1
事務(wù)隔離級(jí)別RR
操作過(guò)程
事務(wù)1|事務(wù)2
-|-
update tmp set name = name - 1 where code = 5;|-
-|select * from tmp where code = 5 for update;
select * from tmp where code = 5 lock in share mode;|--
鎖獲取日志
鎖獲取情況 結(jié)論
問(wèn)題1得到驗(yàn)證祈匙,事務(wù)1是可以申請(qǐng)到S鎖的
實(shí)驗(yàn)2
在進(jìn)行實(shí)驗(yàn)2前凭豪,首先得說(shuō)明replace into語(yǔ)句召锈,針對(duì)已經(jīng)存在的記錄着帽,語(yǔ)句可以拆分為delete+insert携悯,下面我們假設(shè)兩個(gè)事務(wù)同時(shí)執(zhí)行這個(gè)語(yǔ)句
事務(wù)隔離級(jí)別RR
- 操作過(guò)程
事務(wù)1 | 事務(wù)2 |
---|---|
delete from tmp where code = 5; | - |
- | delete from tmp where code = 5; |
insert into tmp values(10,5,5); | ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction |
-
鎖獲取日志
image.png 死鎖分析祭芦、按照上面執(zhí)行sql的順序
事務(wù)1 | 事務(wù)2 |
---|---|
LOCK_X LOCK_NOT_GAP | - |
- | LOCK_X-LOCK_NEXT_KEY 阻塞 |
LOCK_S-LOCK_NEXT_KEY | 死鎖回滾 |
事務(wù)1拿到X記錄鎖,
事務(wù)2檢測(cè)到?jīng)_突憔鬼,獲取X|NK鎖龟劲,被事務(wù)1阻塞
事務(wù)1檢測(cè)到?jīng)_突,申請(qǐng)獲取S|NK轴或,被事務(wù)2阻塞
結(jié)論
replace into死鎖昌跌,如上分析,并不是之前理解的那樣照雁,事務(wù)拿到記錄X鎖蚕愤,獲取S鎖還需要在等待,而是直接就能拿到