亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-10-26 04:37:54 來源:腳本之家 閱讀:144 作者:挖坑的張師傅 欄目:MySQL數據庫

通過好多個深夜艱難的單步調試,終于找到了一個理想的斷點,可以看到大部分獲取鎖的過程
代碼在lock0lock.cstatic 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死鎖問題

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

田东县| 广汉市| 澎湖县| 新蔡县| 苏尼特右旗| 三穗县| 积石山| 临沂市| 新丰县| 常德市| 永城市| 黑山县| 大城县| 张掖市| 泸溪县| 辽阳县| 大姚县| 莱西市| 云林县| 广州市| 抚顺市| 康定县| 黔东| 伊川县| 湟源县| 尉氏县| 丽江市| 清苑县| 翁源县| 桂平市| 鲜城| 锡林浩特市| 梅州市| 永福县| 五莲县| 湄潭县| 米易县| 大邑县| 万安县| 济阳县| 汪清县|