精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

記錄鎖、間隙鎖與 Next-Key Lock

數據庫 MySQL
現在 Gap Lock 間隙鎖,就是要把這些記錄之間的間隙也給鎖住,間隙鎖住了,就不用擔心幻讀問題了,這也是 Gap Lock 存在的意義。

有小伙伴在微信上表示面試時被問到了 Next-Key Lock 是啥,結果一臉懵逼,那么今天我們來捋一捋 MySQL 中的記錄鎖、間隙鎖以及 Next-Key Lock。

1. Record LockRecord

Lock 也就是我們所說的記錄鎖,記錄鎖是對索引記錄的鎖,注意,它是針對索引記錄,即它只鎖定記錄這一行數據。

例如如下一條 SQL:

select * from user where id=1 for update;

注意,id 是索引,id 如果不是索引,上面這條 SQL 所加的排他鎖就不是一個 Record Lock。

我們來看如下一個例子:

首先我們將系統變量 innodb_status_output_locks 設置為 ON,如下:

接下來我們執行如下 SQL,鎖定一行數據,此時會自動為表加上 IX 鎖:

接下來我們在一個新的會話中執行如下指令來查看 InnoDB 存儲引擎的情況:

show engine innodb status\G

輸出的信息很多,我們重點關注 TRANSACTIONS,如下:

可以看到:

  • TABLE LOCK table test08.user trx id 3564804 lock mode IX:這句就是說事務 id 為 3564804 的事務,為 user 表添加了意向排他鎖(IX)。
  • RECORD LOCKS space id 851 page no 3 n bits 80 index PRIMARY of table test08.user trx id 3564804 lock_mode X locks rec but not gap:這個就是一個鎖結構的記錄,這里的索引是 PRIMARY,加的鎖也是正兒八經的記錄鎖(not gap)。

看到了 LOCKS REC BUT NOT GAP,就說明這是一個記錄鎖。

那么這個 Record Lock 和我們之前所講的 S 鎖以及 X 鎖有什么區別呢?S 鎖是共享鎖,X 鎖是排他鎖,當我們加 S 鎖或者 X 鎖的時候,如果用到了索引,鎖加在了某一條具體的記錄上,那么這個鎖也是一個記錄鎖(其實,記錄鎖,S 鎖,X 鎖,概念有一些重復的地方,但是描述的重點不一樣)。

或者也可以理解為記錄鎖又細分為 S 鎖和 X 鎖,它們之間的兼容性如下圖:

兼容性

S 型記錄鎖

X 型記錄鎖

S 型記錄鎖

兼容

不兼容

X 型記錄鎖

不兼容

不兼容

2. Gap Lock

Gap Lock 也叫做間隙鎖,它的存在可以解決幻讀問題,另外需要注意,Gap Lock 也只在 REPEATABLE READ 隔離級別下有效。先來看看什么是幻讀,我們來看如下一個表格:

有兩個會話,A 和 B,先在會話 A 中開啟事務,然后查詢 age 為 99 的用戶總數,注意使用當前讀,因為在默認的隔離級別下,默認的快照讀并不能讀到其他事務提交的數據,至于快照讀和當前讀的區別,大家參考:S 鎖與 X 鎖,當前讀與快照讀!。當會話 A 中第一次查詢過后,會話 B 中向數據庫添加了一行記錄,等到會話 A 中第二次查詢的時候,就查到了和第一次查詢不一樣的結果,這就是幻讀(注意幻讀專指數據插入引起的不一致)。

在 MySQL 默認的隔離級別 REPEATABLE READ 下,上圖所描述的情況無法復現。無法復現的原因在于,在 MySQL 的 REPEATABLE READ 隔離級別中,它已經幫我們解決了幻讀問題,解決的方案就是 Gap Lock。

大家想想,之所以出現幻讀的問題,是因為記錄之間存在縫隙,用戶可以往這些縫隙中插入數據,這就導致了幻讀問題,如下圖:

如圖所示,id 之間有縫隙,有縫隙就有漏洞。前面我們所說的記錄鎖只能鎖住一條具體的記錄,但是對于記錄之間的空隙卻無能無力,這就導致了幻讀(其他事務可往縫隙中插入數據)。

現在 Gap Lock 間隙鎖,就是要把這些記錄之間的間隙也給鎖住,間隙鎖住了,就不用擔心幻讀問題了,這也是 Gap Lock 存在的意義。

給一條記錄加 Gap Lock,是鎖住了這條記錄前面的空隙,例如給 id 為 1 的記錄加 Gap Lock,鎖住的范圍是 (-∞,1),給 id 為 3 的記錄加 Gap Lock,鎖住的范圍是 (1,3),那么 id 為 10 后面的空隙怎么鎖定呢?MySQL 提供了一個 Supremum 表示當前頁面中的最大記錄,所以最后針對 Supremum 鎖住的范圍就是 (10,+∞),這樣,所有的間隙都被覆蓋到了,由于鎖定的是間隙,所以都是開區間。

那么我們怎么樣能看到 Gap Lock 呢?我給大家舉一個簡單的例子,假設我有如下一張表:

CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `age` (`age`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

一個簡單的表,id 是主鍵,age 是普通索引,表中有如下幾條記錄:

接下來我們執行如下 SQL,鎖定一行數據,此時也會產生間隙鎖:

接下來我們在一個新的會話中執行如下指令來查看 InnoDB 存儲引擎的情況:

show engine innodb status\G

輸出的信息很多,我們重點關注 TRANSACTIONS,如下:

紅色框選中的,就是一個間隙鎖的加鎖記錄,可以看到,在某一個記錄之前加了間隙鎖。

這就是間隙鎖。非常重要的一點需要大家牢記:Gap Lock 只在 REPEATABLE READ 隔離級別下有效。

3. Next-Key Lock

以下內容都是基于 MySQL 默認的隔離級別 REPEATABLE READ。

如果我們既想鎖定一行,又想鎖定行之間的記錄,那么就是 Next-Key Lock 了,換言之,Next-Key Lock 是 Record Lock 和 Gap Lock 的結合體。

正常來說,我們加行鎖的基本單位就是 Next-Key Lock,即既有記錄鎖又有間隙鎖,但是有時候 Next-Key Lock 會退化,我們通過幾個簡單的例子來分析一下。

首先我們來看看 Next-Key Lock 的加鎖規則:

  • 鎖的范圍是左開右閉。
  • 如果是唯一非空索引的等值查詢,Next-Key Lock 會退化成 Record Lock。
  • 普通索引上的等值查詢,向后遍歷時,最后一個不滿足等值條件的時候,Next-Key Lock 會退化成 Gap Lock。

我們通過幾個簡單的例子來分析下。

3.1 唯一非空索引

假設我有一個學生表,學生表中有學生的姓名和成績,如下:

CREATE TABLE `student` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`score` double NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `score` (`score`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

id 是主鍵,score 是成績,其中 score 是唯一非空索引。

現在表中有如下數據:

假設我們執行如下 SQL:

在這個例子中,由于 score 是唯一非空索引,所以 Next-Key Lock 會退化成 Record Lock,換句話說,這行 SQL 只給 score 為 90 的記錄加鎖,不存在 Gap Lock,即我們新開一個會話,插入一條 score 為 88 的記錄也是 OK 的。

不過這里有一個特例,如果鎖定的是一個不存在的記錄,那么也會產生間隙鎖,例如下面這個:

由于并不存在 score 為 91 的記錄,所以這里會產生一個范圍為 (90,95) 的間隙鎖,我們執行如下 SQL 可以驗證:

可以看到,90.1、94.9 都會被阻塞(我按了 Ctrl C,所以大家看到查詢終止)。

90、95 則不符合唯一非空索引的條件。

95.1 則可以插入成功。

沒問題。

3.2 非空索引

現在我們重新開始,將 score 索引改為普通索引,如下:

CREATE TABLE `student` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`score` double NOT NULL,
PRIMARY KEY (`id`),
KEY `score` (`score`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

數據還是跟前面一樣,此時我們來執行如下 SQL:

我們來分析下。

此時要鎖定的是 id 為 90 的記錄,那么首先加間隙鎖,上一個 score 為 89,所以這次加的間隙鎖范圍是 (89,90),同時要鎖定 id 為 90 的記錄,所以進一步優化為 (89,90]。

同時,這里還有一條規則,就是滿足條件的上一條記錄,也需要被鎖住,所以最終的鎖范圍就是 [89,90]。

由于 score 不是唯一性索引,所以還需要繼續向后查找,找到的下一條記錄是 95,由于此時 Next-Key Lock 會退化成 Gap Lock,所以鎖定的范圍是 (90,95)。綜上,最終鎖定的范圍是 [89,95)。

接下來我們可以新開一個會話,我們分別嘗試添加如下數據看看是否能夠添加成功:

可以看到,score 為 88 是可以的,但是為 89.1 就不行。

score 為 95 也是可以的,但是為 94.9 就不行。

再試一下 89 是否可以:

說明我們上面分析的加鎖范圍是正確的。

再來看如下一條 SQL:

跟前面的案例相比,這次多了 limit 1,limit 1 表示只要一條記錄,所以這次查找到 90 之后就不會再往后查找了,那么最終的鎖就是間隙鎖+一個記錄鎖,最終的范圍就是 [89,90]。

此時新開一個會話,分別插入 score 為 88.9、89、90、91 的 記錄,驗證我們上面所分析的加鎖范圍:

88.9 和 89 的插入結果跟我們預想的一致。

可以看到,這里 90 也能插入,能插入的原因是因為缺乏 90 往后的間隙鎖。

4. 小結

MySQL 中的鎖有點繁雜,小伙伴們可以趁著某個周末,花點時間捋一捋,以后面試再遇到這些問題的時候就不頭大了。

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2025-04-24 10:56:01

MySQLInnoDB數據庫鎖

2024-06-12 14:03:31

MySQLInnoDB

2021-06-08 09:41:26

MySQL加鎖范圍

2021-06-05 18:02:20

MySQL加鎖范圍

2025-06-04 02:55:00

MySQL意向鎖記錄鎖

2023-06-05 08:15:30

MySQLInnoDB

2022-10-24 08:02:14

MySQL索引類型

2025-08-15 07:55:20

2023-11-06 08:35:08

表鎖行鎖間隙鎖

2023-12-06 07:33:20

MySQL鎖事間隙鎖

2020-10-20 13:50:47

MySQL數據庫

2025-11-14 00:00:15

2025-11-10 08:41:06

2021-12-14 08:10:00

MySQL行鎖間隙鎖

2024-01-16 12:19:08

MySQL重要機制高并發

2020-07-02 08:22:56

MySQL間隙鎖過行鎖

2025-09-16 07:09:32

2024-05-17 09:33:22

樂觀鎖CASversion

2011-11-28 12:55:37

JavaJVM

2013-12-19 13:25:40

InnoDB數據庫
點贊
收藏

51CTO技術棧公眾號

国产成人综合在线观看| 国产精久久一区二区| av中文字幕不卡| 国模精品系列视频| 国产视频一区二区三区在线播放| 亚洲精品午夜国产va久久成人| 日产福利视频在线观看| 久久精品一区二区三区av| 91精品久久久久久久久久久久久| 动漫精品一区二区三区| 欧美成人毛片| 亚洲综合无码一区二区| 日韩精品久久一区| 国产黄a三级三级看三级| 国产情侣久久| 久久夜色精品国产亚洲aⅴ| 欧美大喷水吹潮合集在线观看| 嫩草在线视频| 国产二区国产一区在线观看| 97成人在线视频| 91人妻一区二区三区蜜臀| 久久动漫网址| 3atv一区二区三区| 国产精品免费观看久久| 伊人福利在线| 亚洲国产成人私人影院tom| 成人激情直播| 国产免费的av| 日本麻豆一区二区三区视频| 久久久久久久久爱| 日韩va亚洲va欧美va清高| 国产一区99| 日韩国产欧美区| 国产伦精品一区二区三区精品| 欧美日韩国产黄色| 日韩av三区| 91精品国产综合久久久久| 久久精品网站视频| 中文字幕 在线观看| 亚洲国产中文字幕| 老司机午夜免费福利视频| 精品三级久久久久久久电影聊斋| 喷水一区二区三区| 国产成人avxxxxx在线看| 国产特黄大片aaaa毛片| 91久久综合| 久久久久久久一区二区| 青青草精品在线视频| 欧美一区2区| 一区二区三区美女xx视频| 亚洲一区二区乱码| 人人精品视频| 亚洲免费电影一区| 四虎国产精品成人免费入口| 国产一区调教| 日韩电影大全免费观看2023年上| 成人性生生活性生交12| 中国色在线日|韩| 精品久久中文字幕| 欧美亚洲一二三区| 欧美xxxx黑人又粗又长| 亚洲图片欧美一区| 99视频在线免费播放| 亚洲天堂手机| 91国偷自产一区二区三区成为亚洲经典| 日日噜噜噜噜夜夜爽亚洲精品| 在线观看免费黄色小视频| 欧美a级理论片| 91精品国产综合久久香蕉的用户体验| 中文字幕手机在线观看| 一区二区三区四区日韩| 欧美大荫蒂xxx| 日韩三级小视频| 老**午夜毛片一区二区三区| 国产精品久久久久久久久久三级| 欧美成人手机视频| 午夜欧美精品久久久久久久| 久久久久久久久久久亚洲| 国产精品99精品| 亚洲欧美高清| 国产精品日日摸夜夜添夜夜av| 九九九国产视频| 校园春色综合网| 国产日韩欧美综合| 亚洲精品久久久蜜桃动漫 | 免费成人美女女| 在线看日本不卡| 日本高清免费在线视频| 激情av综合| 在线视频欧美性高潮| 老女人性淫交视频| 免费国产自线拍一欧美视频| 欧洲美女免费图片一区| 午夜精品一区二区三区在线视频 | 国产精品麻豆久久| 精品视频9999| 无码人妻精品一区二区50| 久久99久久久久久久久久久| 国产成人精品日本亚洲11 | 精品国产123| 欧美一区二区三区成人精品| 午夜免费一区| 欧美孕妇性xx| www.爱爱.com| 中文字幕av一区二区三区| 日本三日本三级少妇三级66| 亚洲电影观看| 精品国偷自产国产一区| 1024手机在线观看你懂的| 在线免费高清一区二区三区| 国产精品自在线| 天天干天天插天天操| 国产精品国产三级国产专播品爱网| 日韩电影大全在线观看| 黑人玩欧美人三根一起进| 欧美三级电影精品| 国产精品无码一区二区三区免费 | 亚洲国产另类久久精品| 久久只有这里有精品| 欧美私人啪啪vps| 国产欧美日韩免费| 久久久久久久久亚洲精品| 国产精品剧情在线亚洲| 欧美激情成人网| 国产毛片久久久| 久久av红桃一区二区小说| 亚洲永久精品一区| 久久品道一品道久久精品| 国产精品啪啪啪视频| 成人国产在线| 一区二区三区www| 亚洲欧美一二三区| 91天堂素人约啪| 国产精品无码一区二区在线| 亚洲综合色婷婷在线观看| 久久久精品日本| 在线免费观看一级片| 久久久不卡网国产精品二区| 99精品人妻少妇一区二区| 国产精品色在线网站| 色综合视频网站| 国产wwwxxx| 亚洲六月丁香色婷婷综合久久 | 七七成人影院| 在线视频观看一区| 亚洲av无码国产精品麻豆天美| 欧美日韩国产一区二区三区不卡| 最近2019年好看中文字幕视频 | 国产精品一区二区婷婷| 狠狠躁夜夜躁人人爽天天天天97| 9久久婷婷国产综合精品性色| 亚洲午夜剧场| www.日韩不卡电影av| 亚洲无码精品国产| 18欧美乱大交hd1984| 中文字幕第一页在线视频| 亚洲第一天堂| av噜噜色噜噜久久| 9765激情中文在线| 亚洲精品自产拍| 久久一区二区三区视频| 91性感美女视频| 国产日产欧美视频| 日韩三级在线| 国产欧美精品va在线观看| 精品51国产黑色丝袜高跟鞋| 91精品国产欧美日韩| 国产性70yerg老太| 91丨九色丨黑人外教| 国产黄色特级片| 91精品99| 国模一区二区三区私拍视频| 国产免费拔擦拔擦8x在线播放| 日韩欧美一区二区三区| 久久久久国产精品无码免费看| 色喇叭免费久久综合网| 国产精品永久免费观看| 3d玉蒲团在线观看| 精品视频中文字幕| 91尤物国产福利在线观看| 亚洲夂夂婷婷色拍ww47 | 日本午夜视频在线观看| 国产日韩欧美精品在线| 三级黄色片免费观看| 亚洲久久视频| 亚洲欧洲另类精品久久综合| 日韩在线成人| 国产精品igao视频| 性欧美video高清bbw| 亚洲欧美激情视频| a级片免费观看| 91国内精品野花午夜精品| 免费中文字幕日韩| 久久久精品影视| 中文字幕第一页在线视频| 一本一本久久| 中文字幕av久久| 岳的好大精品一区二区三区| 91丨九色丨国产在线| www.精品| 欧美激情视频在线观看| 精品无吗乱吗av国产爱色| 欧美成人免费网站| 日本一区二区三区久久| 午夜精品久久久久久久蜜桃app| 国产国语老龄妇女a片| 午夜一级在线看亚洲| 黄色网在线视频| 日韩1区2区| 久久精品日韩| 中文一区二区三区四区| 国产在线拍揄自揄视频不卡99 | 国产精品丝袜在线播放| 国产精品专区第二| 成人欧美一区二区三区的电影| 亚洲精品一区二区三区婷婷月| 日韩av黄色片| 亚洲精品国产精华液| 国产欧美一区二区三区在线观看视频| 免费视频最近日韩| aⅴ在线免费观看| 亚洲国产精品一区| 麻豆传媒网站在线观看| 日韩成人精品一区| 日韩久久久久久久久久久久久| 国产亚洲人成a在线v网站| 欧美一级bbbbb性bbbb喷潮片| 亚洲av成人精品毛片| 91精品国产高清一区二区三区 | 国产欧美日韩一级| av在线com| 午夜欧美精品| 久久av秘一区二区三区| 欧美在线色图| 天堂精品视频| 欧美美女视频| 亚洲精品在线免费看| 欧美精品一区二区三区精品| 欧美高清一区二区| 亚洲+变态+欧美+另类+精品| 精品一区在线播放| 午夜欧洲一区| 欧美日韩一区在线播放| 红桃视频在线观看一区二区| 欧美久久久久久一卡四| 日日天天久久| 欧美成人免费在线| 亚洲福利天堂| 日韩精品一区二区三区色偷偷| 3d动漫一区二区三区在线观看| 欧美成人免费在线视频| 国产精品久久久久久福利| 精品国产一区二区三区久久久狼| 亚洲成人中文字幕在线| 精品少妇一区二区三区视频免付费| 日产精品久久久| 色综合欧美在线视频区| 国产一区免费看| 欧美日韩中文字幕一区| 中文字幕精品一区二| 欧洲一区在线电影| 一级全黄裸体免费视频| 91精品国产乱| 手机看片1024日韩| 亚洲欧洲在线视频| av电影在线观看| 欧美老女人性视频| av影片在线| 国产精品成人国产乱一区| 四虎国产精品永久在线国在线 | 一级片中文字幕| 日韩欧美在线一区| 在线观看免费视频一区| 91精品国产综合久久久久| 国产18精品乱码免费看| 亚洲精品永久免费| 午夜伦理在线| 欧美另类在线观看| 欧美xxx黑人xxx水蜜桃| 日本午夜人人精品| 91国产精品| 加勒比在线一区二区三区观看| 精品视频在线播放一区二区三区| 国产成人精品视频在线| 欧美aaa级| 久久99精品久久久久久久青青日本| 国产精品视频一区二区三区综合| 国产精品pans私拍| 蜜桃在线一区| 久久综合色一本| 亚洲草久电影| 国产精品第12页| 韩国三级电影一区二区| 国产网站无遮挡| 亚洲免费观看高清完整版在线观看| 欧美一区二区三区粗大| 亚洲一区二区三区在线| 一级一级黄色片| 亚洲国产高清福利视频| 老司机午夜在线视频| 日本不卡免费高清视频| 7777精品| 中文字幕综合在线观看| 久久午夜电影| 影音先锋资源av| 亚洲品质自拍视频网站| 五月天婷婷导航| 亚洲成人激情在线| 国产激情在线视频| 国产精品日日做人人爱| 亚洲人成网77777色在线播放| 久久久福利视频| 欧美三级午夜理伦三级中文幕| 人人妻人人澡人人爽欧美一区双| 欧美精品播放| 潘金莲激情呻吟欲求不满视频| 日韩高清不卡一区二区三区| 国产成人av片| 自拍偷拍欧美激情| 成年人视频免费| 日韩大陆欧美高清视频区| 电影k8一区二区三区久久| 91精品视频免费看| 成人一区不卡| 日韩视频免费在线播放| 97精品超碰一区二区三区| 日韩va亚洲va欧美va清高| 欧美日韩黄视频| 黄色在线观看网| 欧美与欧洲交xxxx免费观看 | 国产视频福利一区| 欧美猛男同性videos| 免费特级黄色片| 成人黄色综合网站| 国产一级生活片| 日韩一级片在线播放| 草莓福利社区在线| 91亚洲午夜在线| 午夜精品偷拍| 国产免费a级片| 亚洲地区一二三色| 免费观看黄色一级视频| 久久久久久久久久婷婷| 久久中文字幕导航| 熟女少妇在线视频播放| 不卡在线视频中文字幕| 日韩激情在线播放| 日韩av一区二区在线| 天堂网在线最新版www中文网| 国产日韩精品在线播放| 91欧美大片| 国内精品国产三级国产aⅴ久| 91麻豆精品一区二区三区| 天天干天天干天天| 亚洲天堂成人在线视频| 99久久精品一区二区成人| 亚洲精品欧洲精品| 激情五月婷婷综合| 久久久精品国产sm调教网站| 亚洲成人激情在线| 波多野结衣久久精品| 日韩欧美三级电影| 国产最新精品精品你懂的| 麻豆精品一区二区三区视频| 日韩精品一区二| 在线天堂新版最新版在线8| 手机成人在线| 国产精品99久久久久久似苏梦涵| 亚洲精品国产精品国自| 欧美一区二区三区性视频| 欧美家庭影院| 欧洲成人一区二区| 黄色小说综合网站| 日韩高清免费av| 中文字幕日韩欧美在线视频| 日本亚州欧洲精品不卡| 国产午夜福利100集发布| 欧美激情一区三区| 国产成a人亚洲精v品无码| 国内精品久久久久久久| 国产一区二区三区电影在线观看| 亚欧无线一线二线三线区别| 国产蜜臀av在线一区二区三区| 日韩不卡视频在线| 中文字幕av一区二区| 精品视频一区二区三区在线观看| 亚洲精品9999| 成人晚上爱看视频| 欧美 亚洲 另类 激情 另类| 欧美日韩成人在线视频| 国产一区二区精品福利地址| 日韩精品在线播放视频| 色综合色综合色综合 | 在线丨暗呦小u女国产精品| 日本少妇精品亚洲第一区| 日本新janpanese乱熟| 亚洲一级二级在线| 日韩子在线观看| 欧美激情一区二区三区在线视频| 9国产精品视频|