通過好多個深夜艱難的單步除錯,終於找到了乙個理想的斷點,可以看到大部分獲取鎖的過程
**在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 年提出的,因此又叫狄克斯特拉演算法。是從乙個頂點到其餘各頂點的最短路徑演算法,解決的是有權圖中最短路徑問題。迪傑斯特拉演算法主要特點是從起始點開始,採用貪心演算法的策略,每...