最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

初學(xué)者從源碼理解MySQL死鎖問題

 更新時(shí)間:2019年05月22日 14:20:31   作者:挖坑的張師傅  
這篇文章主要講的是如何通過調(diào)試 MySQL 源碼,知道一條 SQL 真正會(huì)拿哪些鎖,不再抓蝦,瞎猜或者何登成大神沒寫過的場(chǎng)景就不知道如何處理了,下面小編來和大家一起學(xué)習(xí)學(xué)習(xí)

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

場(chǎng)景1:通過主鍵進(jìn)行刪除

表結(jié)構(gòu)

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;

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

過程如下

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

場(chǎng)景2:通過唯一索引進(jìn)行刪除

表結(jié)構(gòu)做了微調(diào),增加了 name 的唯一索引

構(gòu)造數(shù)據(jù)
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');
 
測(cè)試sql語句
delete from t2 where name = "Y"

來看實(shí)際源碼調(diào)試的結(jié)果

第一步:

第二步:

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

過程如下

場(chǎng)景3:通過普通索引進(jìn)行刪除

構(gòu)造數(shù)據(jù)
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');
 
測(cè)試語句:
delete from t3 where name = "N";

調(diào)試過程如圖:

結(jié)論:通過普通索引進(jìn)行更新時(shí),會(huì)對(duì)滿足條件的所有普通索引加 X 鎖,同時(shí)會(huì)對(duì)相關(guān)的主鍵索引加 X 鎖

過程如下

場(chǎng)景4:不走索引進(jìn)行刪除

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";

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

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

但是為了效率考量,MySQL做了優(yōu)化,對(duì)于不滿足條件的記錄,會(huì)在判斷后放鎖,最終持有的,是滿足條件的記錄上的鎖,但是不滿足條件的記錄上的加鎖/放鎖動(dòng)作不會(huì)省略。

過程如下

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

九寨沟县| 饶平县| 余姚市| 游戏| 富平县| 宁强县| 宾川县| 手游| 石泉县| 花莲市| 疏附县| 罗定市| 昭通市| 长兴县| 临高县| 台江县| 三江| 黑山县| 昌黎县| 锦州市| 石屏县| 孟津县| 林芝县| 博野县| 隆回县| 栾川县| 岳阳县| 阳江市| 吴江市| 武乡县| 手游| 玉林市| 湘西| 潜山县| 靖宇县| 航空| 梁河县| 达州市| 邵东县| 新密市| 鸡西市|