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

2022-09-25 19:30:11 字數 2219 閱讀 5727

通過好多個深夜艱難的單步除錯,終於找到了乙個理想的斷點,可以看到大部分獲取鎖的過程

**在lock0lock.c的static enum db_err lowww.cppcns.comck_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;

可以看到,對索引 primary 加鎖,mode = 1027,1027是什麼意思呢?1027 =  lock_rec_not_gap + lock_x(非 gap 的記錄鎖且是 x 鎖)

過程如下

結論:根據主鍵 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`)

)tkrtt ;

insert into `t2` (`id`, `name`) values

(1,'m'),

(2,'y'),

(3,'s'),

(4,'q'),

(5,'l');

測試sql語句

delete from t2 where name = "y"

來看實際原始碼除錯的結果

第一步:

第二步:

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

過程如下

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

除錯過程如圖:

結論:通過普通索引進行更新時,會對滿足條件的所有普通索引加 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 把就不一一放上來了

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

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

過程如下

本文標題: 初學者從原始碼理解mysql死鎖問題

本文位址: /shujuku/mysql/260037.html

mysql初學者 MySQL初學者使用指南

一 連線mysql 格式 mysql h主機位址 u使用者名稱 p使用者密碼 1 例1 連線到本機上的mysql。首先在開啟dos視窗,然後進入目錄 mysqlbin,再鍵入命令mysql uroot p,回車後提示你輸密碼,如果剛安裝好mysql,超級使用者root是沒有密碼的,故直接回車即可進入...

使用MySQL 初學者

登入命令 mysql u root p而後便可出現以下內容 現在便可使用mysql了,現在便可使用 資料庫操作 show databases 此 可以檢視建立的資料庫,注意分號以及拼寫 create database 此處 便是你要建立資料庫的名稱 drop database 刪除資料庫 use 這...

Dijkstra 演算法 初學者理解

dijkstra演算法 一.該演算法的背景和目的 迪傑斯特拉演算法 dijkstra 是由荷蘭計算機科學家狄克斯特拉於1959 年提出的,因此又叫狄克斯特拉演算法。是從乙個頂點到其餘各頂點的最短路徑演算法,解決的是有權圖中最短路徑問題。迪傑斯特拉演算法主要特點是從起始點開始,採用貪心演算法的策略,每...