欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

表結(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;

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

過程如下

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

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

表結(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');
 
測試sql語句
delete from t2 where name = "Y"

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

第一步:

第二步:

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

過程如下

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

構(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');
 
測試語句:
delete from t3 where name = "N";

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

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

過程如下

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

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

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

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

過程如下

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • MySQL中的SHOW FULL PROCESSLIST命令實現(xiàn)

    MySQL中的SHOW FULL PROCESSLIST命令實現(xiàn)

    SHOW FULL PROCESSLIST命令是MySQL中一個非常有用的工具,可以幫助我們理解和監(jiān)控MySQL服務器的狀態(tài),本文主要介紹了MySQL中的SHOW FULL PROCESSLIST命令,感興趣的可以了解一下
    2023-11-11
  • Mysql InnoDB和MyISAM區(qū)別原理解析

    Mysql InnoDB和MyISAM區(qū)別原理解析

    這篇文章主要介紹了Mysql InnoDB和MyISAM區(qū)別原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • window10下mysql 8.0.20 安裝配置方法圖文教程

    window10下mysql 8.0.20 安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了window10下mysql 8.0.20 安裝配置方法圖文教程,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 解決遠程連接mysql很慢的方法(mysql_connect 打開連接慢)

    解決遠程連接mysql很慢的方法(mysql_connect 打開連接慢)

    有次同事提出開發(fā)使用的mysql數(shù)據(jù)庫連接很慢,因為我們的mysql開發(fā)數(shù)據(jù)庫是單獨一臺機器部署的,所以認為可能是網(wǎng)絡連接問題導致的。
    2011-07-07
  • MySQL中列子查詢與行子查詢操作的學習教程

    MySQL中列子查詢與行子查詢操作的學習教程

    這篇文章主要介紹了MySQL中列子查詢與行子查詢操作的學習教程,子查詢是MySQL入門學習中的基礎知識,需要的朋友可以參考下
    2015-12-12
  • MySQL事務控制流與ACID特性

    MySQL事務控制流與ACID特性

    本文將會介紹 MySQL 的事務 ACID 特性和 MySQL 事務控制流程的語法,并介紹事務并發(fā)處理中可能出現(xiàn)的異常情況,比如臟讀、幻讀、不可重復讀等等,最后介紹事務隔離級別。感興的小伙伴可以一起來學習
    2021-08-08
  • mysql更改引擎(InnoDB,MyISAM)的方法

    mysql更改引擎(InnoDB,MyISAM)的方法

    這篇文章主要介紹了mysql更改引擎(InnoDB,MyISAM)的方法,實例講述了比較常見的幾種更改引擎的方法,非常具有實用價值,需要的朋友可以參考下
    2014-11-11
  • MySQL5.7 集群配置的步驟

    MySQL5.7 集群配置的步驟

    這篇文章主要介紹了MySQL5.7 集群配置的步驟,幫助大家更好的理解和學習使用MySQL,感興趣的朋友可以了解下
    2021-03-03
  • mysql 5.7.11 zip安裝配置方法圖文教程

    mysql 5.7.11 zip安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了mysql 5.7.11 安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • MySQL刪除了記錄不生效的原因排查

    MySQL刪除了記錄不生效的原因排查

    這篇文章主要介紹了MySQL刪除了記錄不生效的原因排查,幫助大家解決MySQL刪除語句不生效的問題,感興趣的朋友可以了解下
    2020-11-11

最新評論