久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

初學者從源碼理解MySQL死鎖問題

136次閱讀
沒有評論

共計 1492 個字符,預計需要花費 4 分鐘才能閱讀完成。

自動寫代碼機器人,免費開通

通過好多個深夜艱難的單步調試,終于找到了一個理想的斷點,可以看到大部分獲取鎖的過程
代碼在 lock0lock.c 的 static enum db_err lock_rec_lock() 函數中,這個函數會顯示,獲取鎖的過程,以及獲取鎖成功與否。

場景 1:通過主鍵進行刪除

表結構

CREATE TABLE `t1` (`id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(10) NOT NULL DEFAULT '',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB;
delete from t1 where id = 10;

初學者從源碼理解 MySQL 死鎖問題

可以看到,對索引 PRIMARY 加鎖,mode = 1027,1027 是什么意思呢?1027 =  LOCK_REC_NOT_GAP + LOCK_X(非 gap 的記錄鎖且是 X 鎖)

過程如下

初學者從源碼理解 MySQL 死鎖問題

結論:根據主鍵 id 去刪除數據,且沒有其它索引的情況下,此 SQL 只需要在 id = 10 這條記錄上對主鍵索引加 X 鎖即可

場景 2:通過唯一索引進行刪除

表結構做了微調,增加了 name 的唯一索引

CREATE TABLE `t2` (`id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(10) NOT NULL DEFAULT '',
 PRIMARY KEY (`id`),
 UNIQUE KEY `uk_name` (`name`)
INSERT INTO `t2` (`id`, `name`) VALUES 
 (1,'M'),
 (2,'Y'),
 (3,'S'),
 (4,'Q'),
 (5,'L');
測試 sql 語句
delete from t2 where name = "Y"

來看實際源碼調試的結果

第一步:

初學者從源碼理解 MySQL 死鎖問題

第二步:

初學者從源碼理解 MySQL 死鎖問題

結論:這個過程是先對唯一鍵 uk_name 加 X 鎖,然后再對聚簇索引(主鍵索引)加 X 鎖

過程如下

初學者從源碼理解 MySQL 死鎖問題

場景 3:通過普通索引進行刪除

CREATE TABLE `t3` (`id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(10) NOT NULL DEFAULT '',
 PRIMARY KEY (`id`),
 KEY `idx_name` (`name`) 
INSERT INTO `t3` (`id`, `name`) VALUES 
 (1,'N'),
 (2,'G'),
 (3,'I'),
 (4,'N'),
 (5,'X');
測試語句:delete from t3 where name = "N";

調試過程如圖:

初學者從源碼理解 MySQL 死鎖問題

結論:通過普通索引進行更新時,會對滿足條件的所有普通索引加 X 鎖,同時會對相關的主鍵索引加 X 鎖

過程如下

初學者從源碼理解 MySQL 死鎖問題

場景 4:不走索引進行刪除

CREATE TABLE `t4` (`id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(10) NOT NULL DEFAULT '',
 PRIMARY KEY (`id`)
INSERT INTO `t4` (`id`, `name`) VALUES 
 (1,'M'),
 (2,'Y'),
 (3,'S'),
 (4,'Q'),
 (5,'L');
delete from t4 where name = "S";

初學者從源碼理解 MySQL 死鎖問題

初學者從源碼理解 MySQL 死鎖問題

總共有 5 把 X 鎖,剩下的 3 把就不一一放上來了

結論:不走索引進行更新時,sql 會走聚簇索引(主鍵索引)對全表進行掃描,因此每條記錄,無論是否滿足條件,都會被加上 X 鎖。還沒完 …

但是為了效率考量,MySQL 做了優化,對于不滿足條件的記錄,會在判斷后放鎖,最終持有的,是滿足條件的記錄上的鎖,但是不滿足條件的記錄上的加鎖 / 放鎖動作不會省略。

過程如下

初學者從源碼理解 MySQL 死鎖問題

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持丸趣 TV。

向 AI 問一下細節

丸趣 TV 網 – 提供最優質的資源集合!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-12-18發表,共計1492字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 博乐市| 雷波县| 紫金县| 山东省| 集贤县| 泗洪县| 富川| 略阳县| 蕉岭县| 南漳县| 枣阳市| 客服| 大新县| 阿巴嘎旗| 金阳县| 灌南县| 若尔盖县| 林甸县| 滕州市| 元江| 林州市| 宁河县| 威海市| 旬阳县| 石河子市| 哈尔滨市| 阳新县| 浙江省| 罗源县| 周口市| 五大连池市| 福海县| 贵南县| 保山市| 越西县| 洮南市| 鄂托克旗| 隆林| 东至县| 花莲县| 邵阳县|