婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 淺談MySQL next-key lock 加鎖范圍

淺談MySQL next-key lock 加鎖范圍

熱門標簽:html地圖標注并導航 催天下外呼系統 北京金倫外呼系統 武漢電銷機器人電話 400電話辦理服務價格最實惠 大豐地圖標注app 呂梁外呼系統 南太平洋地圖標注 400電話變更申請

前言

某天,突然被問到 MySQL 的 next-key lock,我瞬間的反應就是:

這都是啥啥啥???

這一個截圖我啥也看不出來呀?

仔細一看,好像似曾相識,這不是《MySQL 45 講》里面的內容么?

什么是 next-key lock

A next-key lock is a combination of a record lock on the index record and a gap lock on the gap before the index record.

官網的解釋大概意思就是:next-key 鎖是索引記錄上的記錄鎖和索引記錄之前的間隙上的間隙鎖的組合。

先給自己來一串小問號???

  • 在主鍵、唯一索引、普通索引以及普通字段上加鎖,是鎖住了哪些索引?
  • 不同的查詢條件,分別鎖住了哪些范圍的數據?
  • for share 和 for update 等值查詢和范圍查詢的鎖范圍?
  • 當查詢的等值不存在時,鎖范圍是什么?
  • 當查詢條件分別是主鍵、唯一索引、普通索引時有什么區別?

既然啥都不懂,那只好從頭開始操作實踐一把了!

先看看看 《MySQL 45 講》中丁奇老師的結論:

看了這結論,應該可以解答一大部分問題,不過有一句非常非常重點的話需要關注:MySQL 后面的版本可能會改變加鎖策略,所以這個規則只限于截止到現在的最新版本,即 5.x 系列=5.7.24,8.0 系列 =8.0.13

所以,以上的規則,對現在的版本并不一定適用,下面我以 MySQL 8.0.25 版本為例,進行多角度驗證 next-key lock 加鎖范圍。

環境準備

MySQL 版本:8.0.25

隔離級別:可重復讀(RR)

存儲引擎:InnoDB

mysql> select @@global.transaction_isolation,@@transaction_isolation\G
mysql> show create table t\G

如何使用 Docker 安裝 MySQL,可以參考另一篇文章《使用 Docker 安裝并連接 MySQL》

主鍵索引

首先來驗證主鍵索引的 next-key lock 的范圍

此時數據庫的數據如圖所示,對主鍵索引來說此時數據間隙如下:

主鍵等值查詢 —— 數據存在

mysql> begin; select * from t where id = 10 for update;

這條 SQL,對 id = 10 進行加鎖,可以先思考一下加了什么鎖?鎖住了什么數據?

可以通過 data_locks 查看鎖信息,SQL 如下:

# mysql> select * from performance_schema.data_locks;
mysql> select * from performance_schema.data_locks\G

具體字段含義可以參考 官方文檔

結果主要包含引擎、庫、表等信息,咱們需要重點關注以下幾個字段:

  • INDEX_NAME:鎖定索引的名稱
  • LOCK_TYPE:鎖的類型,對于 InnoDB,允許的值為 RECORD 行級鎖 和 TABLE 表級鎖。
  • LOCK_MODE:鎖的類型:S, X, IS, IX, and gap locks
  • LOCK_DATA:鎖關聯的數據,對于 InnoDB,當 LOCK_TYPE 是 RECORD(行鎖),則顯示值。當鎖在主鍵索引上時,則值是鎖定記錄的主鍵值。當鎖是在輔助索引上時,則顯示輔助索引的值,并附加上主鍵值。

結果很明顯,這里是對表添加了一個 IX 鎖 并對主鍵索引 id = 10 的記錄,添加了一個 X,REC_NOT_GAP 鎖,表示只鎖定了記錄。

同樣 for share 是對表添加了一個 IS 鎖并對主鍵索引 id = 10 的記錄,添加了一個 S 鎖。

可以得出結論:

對主鍵等值加鎖,且值存在時,會對表添加意向鎖,同時會對主鍵索引添加行鎖。

主鍵等值查詢 —— 數據不存在

mysql> select * from t where id = 11 for update;

如果是數據不存在的時候,會加什么鎖呢?鎖的范圍又是什么?

在驗證之前,分析一下數據的間隙。

  • id = 11 是肯定不存在的。但是加了 for update,這時需要加 next-key lock,id = 11 所屬區間為 (10,15] 的前開后閉區間;
  • 因為是等值查詢,不需要鎖 id = 15 那條記錄,next-key lock 會退化為間隙鎖;
  • 最終區間為 (10,15) 的前開后開區間。

使用 data_locks 分析一下鎖信息:

看下鎖的信息 X,GAP 表示加了間隙鎖,其中 LOCK_DATA = 15,表示鎖的是 主鍵索引 id = 15 之前的間隙。

此時在另一個 Session 執行 SQL,答案顯而易見,是 id = 12 不可以插入,而 id = 15 是可以更新的。

可以得出結論,在數據不存在時,主鍵等值查詢,會鎖住該主鍵查詢條件所在的間隙。

主鍵范圍查詢(重點)

mysql> begin; select * from t where id >= 10 and id  11 for update;

根據 《MySQL 45 講》分析得出下面結果:

  • id >= 10 定位到 10 所在的區間 (10,+∞);
  • 因為是 >= 存在等值判斷,所以需要包含 10 這個值,變為 [10,+∞) 前閉后閉區間;
  • id 11 限定后續范圍,則根據 11 判斷下一個區間為 15 的前開后閉區間;
  • 結合起來則是 [10,15]。(不完全正確)

先看下 data_locks

可以看到除了表鎖之外,還有 id = 10 的行鎖(X,REC_NOT_GAP)以及主鍵索引 id = 15 之前的間隙鎖(X,GAP)。

所以實際上 id = 15 是可以進行更新的。也就是說前開后閉區間出現了問題,個人認為應該是 id 11 這個條件判斷,導致不需要進行了鎖 15 這個行鎖。

結果驗證也是正確的,id = 12 插入阻塞,id = 15 更新成功。

當范圍的右側是包含等值查詢呢?

mysql> begin; select * from t where id > 10 and id = 15 for update;

來分析一下這個 SQL:

id > 10 定位到 10 所在的區間 (10,+∞);id = 15 定位是 (-∞, 15];結合起來則是 (10,15]。

同樣先看一下 data_locks

可以看出只添加了一個主鍵索引 id = 15 的 X 鎖。

驗證下 id = 15 是否可以更新?再驗證 id = 16 是否可以插入?

事實證明是沒有問題的!

當然,這里有小伙伴會說,在 《MySQL 45 講》 里面說這里有一個 bug,會鎖住下一個 next-key。

事實證明,這個 bug 已經被修復了。修復版本為 MySQL 8.0.18。但是并沒有完全修復!!!

參考鏈接地址:

https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-18.html

搜索關鍵字:Bug #29508068)

咱們可以分別用 8.0.17 進行復現一下:

在 8.0.17 中 id = 15 會將 id = 20 這條數據也鎖著,而在 8.0.25 版本中則不會。所以這個 bug 是被修復了的。

再來看下是前開后閉還是前開后開的問題,嚴謹一下,使用 8.0.17 和 8.0.18 做比較。

現在我估計大概率是在 8.0.18 版本修復 Bug #29508068 的時候,把這個前開后閉給優化成了前開后開了。

對比 data_locks 數據:

注意紅色下劃線部分,在 8.0.17 版本中 id 17 時 LOCK_MODE 是 X,而在 8.0.25 版本中則是 X,GAP

總結

本文主要通過實際操作,對主鍵加鎖時的 next-key lock 范圍進行了驗證,并查閱資料,對比版本得出不同的結論。

結論一:

  • 加鎖時,會先給表添加意向鎖,IX 或 IS;
  • 加鎖是如果是多個范圍,是分開加了多個鎖,每個范圍都有鎖;(這個可以實踐下 id 20 的情況)
  • 主鍵等值查詢,數據存在時,會對該主鍵索引的值加行鎖 X,REC_NOT_GAP
  • 主鍵等值查詢,數據不存在時,會對查詢條件主鍵值所在的間隙添加間隙鎖 X,GAP
  • 主鍵等值查詢,范圍查詢時情況則比較復雜:
    • 8.0.17 版本是前開后閉,而 8.0.18 版本及以后,進行了優化,主鍵時判斷不等,不會鎖住后閉的區間。
    • 臨界 = 查詢時,8.0.17 會鎖住下一個 next-key 的前開后閉區間,而 8.0.18 及以后版本,修復了這個 bug。

優化后,導致后開,這個不知道是因為優化后,主鍵的區間會直接后開,還是因為是個 bug。具體小伙伴可以嘗試一下。

結論二

通過使用 select * from performance_schema.data_locks; 和操作實踐,可以看出 LOCK_MODE 和 LOCK_DATE 的關系:

LOCK_MODE LOCK_DATA 鎖范圍
X,REC_NOT_GAP 15 15 那條數據的行鎖
X,GAP 15 15 那條數據之前的間隙,不包含 15
X 15 15 那條數據的間隙,包含 15

LOCK_MODE = X 是前開后閉區間;X,GAP 是前開后開區間(間隙鎖);X,REC_NOT_GAP 行鎖。

基本已經摸清主鍵的 next-key lock 范圍,注意版本使用的是 8.0.25。

疑問

  • 那唯一索引的 next-key lock 范圍是什么?
  • 當索引覆蓋時鎖的范圍和加鎖的索引分別是什么?
  • 我為什么說這個 bug 沒有完全修復,也是在非主鍵唯一索引中復現了這個 bug​。

文章篇幅有限,小伙伴可以先自己思考一下,盡量自己操作試一試,實踐出真知。至于具體答案,那就需要下一篇文章進行驗證并總結結論了。

到此這篇關于淺談MySQL next-key lock 加鎖范圍 的文章就介紹到這了,更多相關MySQL next-key lock 加鎖范圍 內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • MySQL出現Waiting for table metadata lock的原因方法
  • MySQL表結構變更你不可不知的Metadata Lock詳解
  • MYSQL METADATA LOCK(MDL LOCK)MDL鎖問題分析
  • MySQL slave 延遲一列 外鍵檢查和自增加鎖
  • MySQL 加鎖控制并發的方法
  • PHP+MySQL高并發加鎖事務處理問題解決方法
  • MYSQL METADATA LOCK(MDL LOCK) 理論及加鎖類型測試

標簽:自貢 龍巖 麗水 西寧 迪慶 南充 無錫 徐州

巨人網絡通訊聲明:本文標題《淺談MySQL next-key lock 加鎖范圍》,本文關鍵詞  淺談,MySQL,next-key,lock,加鎖,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《淺談MySQL next-key lock 加鎖范圍》相關的同類信息!
  • 本頁收集關于淺談MySQL next-key lock 加鎖范圍的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美精品一区二| 亚洲卡通动漫在线| 国产欧美日韩在线视频| 成人午夜看片网址| 久久先锋影音av鲁色资源| 日本欧美在线看| 成人欧美一区二区三区视频网页 | 91丨九色丨国产丨porny| 日韩和欧美一区二区| 国产精品国产三级国产三级人妇| 欧美美女bb生活片| 奇米色一区二区| 亚洲成人动漫在线免费观看| 亚洲成人激情自拍| 亚洲 欧美综合在线网络| 日韩电影免费在线| 国产麻豆精品久久一二三| 国产在线精品一区在线观看麻豆| 亚洲高清一区二区三区| 亚洲午夜电影在线观看| 琪琪久久久久日韩精品| 成人黄色网址在线观看| 欧美日韩免费高清一区色橹橹| 欧美色国产精品| 国产精品高潮呻吟久久| 午夜伊人狠狠久久| 狠狠色丁香婷婷综合| 成人网男人的天堂| 99久久综合99久久综合网站| 欧美无人高清视频在线观看| 日韩欧美的一区| 亚洲日本va午夜在线影院| 亚洲v日本v欧美v久久精品| 国产精品资源在线观看| 粗大黑人巨茎大战欧美成人| 欧美午夜不卡视频| 国产午夜亚洲精品午夜鲁丝片| 欧美精品一区二区三区蜜桃| 日韩精品一卡二卡三卡四卡无卡| 本田岬高潮一区二区三区| 久久综合色婷婷| 狠狠色狠狠色综合日日91app| 色婷婷av一区二区三区软件 | 91在线精品秘密一区二区| 91香蕉视频黄| 尤物av一区二区| 精品美女一区二区三区| 国产精品久久久99| 国产美女精品在线| 精品久久久久久久久久久久包黑料 | 黄色小说综合网站| 91精品在线免费观看| 亚洲一区二区3| 国产成人精品aa毛片| 亚洲欧洲性图库| 国产毛片一区二区| 久久久久国产成人精品亚洲午夜| 午夜精品久久一牛影视| 日韩免费观看高清完整版| 成人午夜大片免费观看| 亚洲午夜影视影院在线观看| 777奇米四色成人影色区| 蜜臀av一区二区在线免费观看| 7777精品伊人久久久大香线蕉经典版下载 | 中文字幕av一区二区三区高 | 中文字幕亚洲电影| 91看片淫黄大片一级在线观看| 国产精品久99| 亚洲精品一区二区三区影院 | 精品国产成人系列| 久久99精品久久久久久国产越南| 国产欧美一区二区精品婷婷| 欧美日韩视频在线一区二区| 久久99国产精品久久99果冻传媒| 亚洲色图欧洲色图| 日韩欧美成人一区二区| 久久久精品黄色| 美女尤物国产一区| 国产成人精品亚洲日本在线桃色| 亚洲国产精品人人做人人爽| 97久久超碰国产精品| 蜜臀av一区二区在线免费观看| 美脚の诱脚舐め脚责91| 国产精品伊人色| 欧美日韩午夜在线| 精品国产网站在线观看| 国产精品 欧美精品| 国产在线看一区| 国产夫妻精品视频| 久久国产尿小便嘘嘘尿| 日韩免费观看2025年上映的电影| 日本高清免费不卡视频| 欧洲av一区二区嗯嗯嗯啊| 国产·精品毛片| 日韩一区在线免费观看| 欧美一区日韩一区| 成人性生交大片免费看视频在线 | 欧美肥妇bbw| 日韩写真欧美这视频| 欧美人与性动xxxx| 91丨九色丨蝌蚪富婆spa| av成人免费在线观看| 欧美日韩aaa| 久久久久国产精品麻豆| 国产精品丝袜久久久久久app| 亚洲人成精品久久久久| 亚洲国产精品一区二区尤物区| 亚洲国产精品久久久男人的天堂| 亚洲va欧美va人人爽| 欧美私模裸体表演在线观看| 国产一区二区毛片| 中文字幕五月欧美| 3d动漫精品啪啪一区二区竹菊 | 偷窥少妇高潮呻吟av久久免费| 欧美一级黄色片| 色哦色哦哦色天天综合| 成人看片黄a免费看在线| 午夜精品123| 亚洲国产高清aⅴ视频| 欧美一区日韩一区| 欧美精品乱码久久久久久按摩| 波多野结衣中文字幕一区| 美女一区二区三区| 一区二区国产盗摄色噜噜| 国产精品乱人伦中文| 国产日韩欧美精品在线| 精品国产乱码久久久久久老虎| 欧美视频一区二| 91网站最新地址| 欧洲精品在线观看| 91麻豆国产精品久久| 欧美性三三影院| 欧美日韩情趣电影| 精品少妇一区二区三区免费观看| 欧美性受xxxx| 精品福利二区三区| 亚洲日韩欧美一区二区在线| 亚洲欧美日韩一区二区| 中文字幕日本不卡| 一区二区高清视频在线观看| 日韩一区精品视频| 成人激情午夜影院| 色综合天天综合网天天狠天天| 欧美日韩一本到| 国产精品超碰97尤物18| 亚洲va韩国va欧美va精品 | 国产三级精品三级在线专区| 99在线热播精品免费| 337p亚洲精品色噜噜| 亚洲欧美aⅴ...| 国产成人日日夜夜| 在线播放91灌醉迷j高跟美女| 欧美国产精品一区二区三区| 亚洲二区视频在线| 国产suv精品一区二区三区| 欧美日韩1234| 日韩高清不卡一区二区三区| 日本韩国精品在线| 亚洲特级片在线| 在线观看视频一区二区| 亚洲午夜国产一区99re久久| 99精品热视频| 国产精品麻豆99久久久久久| 久久99精品国产麻豆婷婷| 久久久精品国产99久久精品芒果| 国产精品18久久久久久久久| 国产精品嫩草影院av蜜臀| 国产精品福利一区| 中文字幕成人在线观看| 亚洲人成7777| 亚洲黄网站在线观看| 有码一区二区三区| 视频一区二区欧美| 丝袜美腿亚洲综合| 一区二区三区中文字幕精品精品 | 欧美精品一级二级| 久久久久久久久久看片| 欧美成人性战久久| 久久精品人人做人人爽97| 亚洲一区在线视频| 亚洲三级电影网站| 日韩一本二本av| 中文字幕一区三区| 亚洲高清视频中文字幕| 成人精品亚洲人成在线| 亚洲黄色尤物视频| 一区二区三区资源| 91搞黄在线观看| 一区二区三区四区在线| 国产成人在线免费观看| 一区二区三区日韩精品| 欧美成人福利视频| 9色porny自拍视频一区二区| 又紧又大又爽精品一区二区| 日韩伦理电影网| 久久精品人人爽人人爽| 欧美精品一区二区不卡 | 国产网站一区二区| 欧美精品日韩精品| 91精品国产一区二区人妖|