精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

詳細總結下InnoDB存儲引擎中行鎖的加鎖規則

jf_ro2CN3Fa ? 來源:飛天小牛肉 ? 2023-02-21 14:02 ? 次閱讀

首先眾所周知,InnoDB 三種行鎖:

Record Lock(記錄鎖) :鎖住某一行記錄

Gap Lock(間隙鎖) :鎖住一段左開右開的區間

Next-key Lock(臨鍵鎖) :鎖住一段左開右閉的區間

哪些語句上面會加行鎖?

1)對于常見的 DML 語句(如 UPDATE、DELETE 和 INSERT ),InnoDB 會自動給相應的記錄行加寫鎖

2)默認情況下對于普通 SELECT 語句,InnoDB 不會加任何鎖,但是在 Serializable 隔離級別下會加行級讀鎖

上面兩種是隱式鎖定,InnoDB 也支持通過特定的語句進行顯式鎖定:

3)SELECT * FROM table_name WHERE ... FOR UPDATE,加行級寫鎖

4)SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE,加行級讀鎖

前置知識就不過多介紹了,在學習具體行鎖加鎖規則之前,小伙伴們需要記住加鎖規則的兩條核心:

1)查找過程中訪問到的對象才會加鎖

這句話該怎么理解?比如有主鍵 id 為 1 2 3 4 5 ... 10 的 10 條記錄,我們要找到 id = 7 的記錄。注意,查找并不是從第一行開始一行一行地進行遍歷,而是根據 B+ 樹的特性進行二分查找,所以一般存儲引擎只會訪問到要找的記錄行(id = 7)的相鄰區間

2)加鎖的基本單位是 Next-key Lock

下面結合實例幫助大伙分析一條 SQL 語句上面究竟被 InnoDB 自動加上了多少個鎖

假設有這么一張 user 表,id 為主鍵(唯一索引),a 是普通索引(非唯一索引),b都是普通的列,其上沒有任何索引:

id (唯一索引) a (非唯一索引) b
10 4 Alice
15 8 Bob
20 16 Cilly
25 32 Druid
30 64 Erik

案例 1:唯一索引等值查詢

當我們用唯一索引進行等值查詢的時候,根據查詢的記錄是否存在,加鎖的規則會有所不同:

當查詢的記錄是存在的,Next-key Lock 會退化成記錄鎖

當查詢的記錄是不存在的,Next-key Lock 會退化成間隙鎖

查詢的記錄存在

先來看個查詢的記錄存在的案例:

select*fromuser
whereid=25
forupdate;

結合加鎖的兩條核心:查找過程中訪問到的對象才會加鎖 + 加鎖的基本單位是 Next-key Lock(左開右閉),我們可以分析出,這條語句的加鎖范圍是 (20, 25]

不過,由于這個唯一索引等值查詢的記錄 id = 25 是存在的,因此,Next-key Lock 會退化成記錄鎖,因此最終的加鎖范圍是 id = 25 這一行

查詢的記錄不存在

再來看查詢的記錄不存在的案例:

select*fromuser
whereid=22
forupdate;

結合加鎖的兩條核心:查找過程中訪問到的對象才會加鎖 + 加鎖的基本單位是 Next-key Lock(左開右閉),我們可以分析出,這條語句的加鎖范圍是 (20, 25]

這里為什么是 (20,25] 而不是 (20, 22],因為 id = 22 的記錄不存在呀,InnoDB 先找到 id = 20 的記錄,發現不匹配,于是繼續往下找,發現 id = 25,因此,id = 25 的這一行被掃描到了,所以整體的加鎖范圍是 (20, 25]

由于這個唯一索引等值查詢的記錄 id = 22 是不存在的,因此,Next-key Lock 會退化成間隙鎖,因此最終在主鍵 id 上的加鎖范圍是 Gap Lock (20, 25)

案例 2:唯一索引范圍查詢

唯一索引范圍查詢的規則和等值查詢的規則一樣,只有一個區別,就是唯一索引的范圍查詢需要一直向右遍歷到第一個不滿足條件的記錄,下面結合案例來分析:

select*fromuser
whereid>=20andid

先來看語句查詢條件的前半部分 id >= 20,因此,這條語句最開始要找的第一行是 id = 20,結合加鎖的兩個核心,需要加上 Next-key Lock (15,20]。又由于 id 是唯一索引,且 id = 20 的這行記錄是存在的,因此會退化成記錄鎖,也就是只會對 id = 20 這一行加鎖。

再來看語句查詢條件的后半部分 id < 22,由于是范圍查找,就會繼續往后找第一個不滿足條件的記錄,也就是會找到 id = 25 這一行停下來,然后加 Next-key Lock (20, 25],重點來了,但由于 id = 25 不滿足 id < 22,因此會退化成間隙鎖,加鎖范圍變為 (20, 25)。

所以,上述語句在主鍵 id 上的最終的加鎖范圍是 Record Lock id = 20 以及 Gap Lock (20, 25)

案例 3:非唯一索引等值查詢

當我們用非唯一索引進行等值查詢的時候,根據查詢的記錄是否存在,加鎖的規則會有所不同:

1、當查詢的記錄是存在的,除了會加 Next-key Lock 外,還會額外加間隙鎖(規則是向下遍歷到第一個不符合條件的值才能停止),也就是會加兩把鎖

很好記憶,就是要查找記錄的左區間加 Next-key Lock,右區間加 Gap lock

2、當查詢的記錄是不存在的,Next-key Lock 會退化成間隙鎖(這個規則和唯一索引的等值查詢是一樣的)

查詢的記錄存在

先來看個查詢的記錄存在的案例:

select*fromuser
wherea=16
forupdate;

結合加鎖的兩條核心,這條語句首先會對普通索引 a 加上 Next-key Lock,范圍是 (8,16]

又因為是非唯一索引等值查詢,且查詢的記錄 a= 16 是存在的,所以還會加上間隙鎖,規則是向下遍歷到第一個不符合條件的值才能停止,因此間隙鎖的范圍是 (16,32)

所以,上述語句在普通索引 a 上的最終加鎖范圍是 Next-key Lock (8,16] 以及 Gap Lock (16,32)

查詢的記錄不存在

再來看查詢的記錄不存在的案例:

select*fromuser
wherea=18
forupdate;

結合加鎖的兩條核心,這條語句首先會對普通索引 a 加上 Next-key Lock,范圍是 (16,32]

但是由于查詢的記錄 a = 18 是不存在的,因此 Next-key Lock 會退化為間隙鎖,即最終在普通索引 a 上的加鎖范圍是 (16,32)。

案例 4:非唯一索引范圍查詢

范圍查詢和等值查詢的區別在上面唯一索引章節已經介紹過了,就是范圍查詢需要一直向右遍歷到第一個不滿足條件的記錄,和唯一索引范圍查詢不同的是,非唯一索引的范圍查詢并不會退化成 Record Lock 或者 Gap Lock。

select*fromuser
wherea>=16anda

先來看語句查詢條件的前半部分 a >= 16,因此,這條語句最開始要找的第一行是 a = 16,結合加鎖的兩個核心,需要加上 Next-key Lock (8,16]。雖然非唯一索引 a = 16的這行記錄是存在的,但此時并不會像唯一索引那樣退化成記錄鎖。

再來看語句查詢條件的后半部分 a < 18,由于是范圍查找,就會繼續往后找第一個不滿足條件的記錄,也就是會找到 id = 32 這一行停下來,然后加 Next-key Lock (16, 32]。雖然 id = 32 不滿足 id < 18,但此時并不會向唯一索引那樣退化成間隙鎖。

所以,上述語句在普通索引 a 上的最終的加鎖范圍是 Next-key Lock (8, 16] 和 (16, 32],也就是 (8, 32]。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • SQL
    SQL
    +關注

    關注

    1

    文章

    760

    瀏覽量

    44076
  • GAP
    GAP
    +關注

    關注

    0

    文章

    15

    瀏覽量

    8298
  • DML模型
    +關注

    關注

    0

    文章

    4

    瀏覽量

    6011

原文標題:美團:這個 SQL 語句加了哪些鎖?

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    深度剖析MySQL/InnoDB的并發控制和加鎖技術

    read),四種隔離級別(isolation level)等作詳細的闡述,并且基于一個簡單的例子,對MySQL的加鎖進行了一個詳細的分析。本文的總結參考了何登成前輩的博客,并且在前輩
    的頭像 發表于 10-29 14:36 ?2123次閱讀
    深度剖析MySQL/<b class='flag-5'>InnoDB</b>的并發控制和<b class='flag-5'>加鎖</b>技術

    allegro 差分對規則設置

    自己總結下差分對規則的設置
    發表于 03-01 01:48

    詳解Mysql數據庫InnoDB存儲引擎事務

    關于Mysql數據庫InnoDB存儲引擎事務的一點理解
    發表于 05-13 10:11

    InnoDB的特點和狀態查詢

    MySQL探秘(五)InnoDB的類型和狀態查詢
    發表于 08-07 11:45

    MySQL存儲引擎簡析

    MySQL存儲引擎InnoDB??InnoDB存儲文件有兩個,后綴名分別是.frm和.idb,其中.frm是表的定義文件,而.idb是數
    發表于 09-06 06:07

    總結下單片機的這幾種架構

    “從畢業到工作的這10年的時間,自己使用的單片機架構也在升級,從最初的前后臺順序執行到時間片輪轉調度再到現在RTOS,下面就結合一些案例來總結下這幾種架構吧”01—前后臺順序法這種方法,...
    發表于 12-09 07:04

    總結下弱電工程中存在的問題以及解決手段

    總結下弱電工程中存在的問題,以及解決手段,做工程的過程中,只有不斷總結,才能快速的積累經驗。
    的頭像 發表于 12-28 08:36 ?1.2w次閱讀

    詳細介紹MySQL InnoDB存儲引擎各種不同類型的

    T1執行時,需要獲取i=1的行的X(不需要獲取t1表的意向了);T2執行時,需要獲取t1表的X,T2能否獲取到T1表的X呢?T2無法立即知道,T2不得不遍歷表t1的每一個數據行
    的頭像 發表于 02-20 11:12 ?7619次閱讀
    <b class='flag-5'>詳細</b>介紹MySQL <b class='flag-5'>InnoDB</b><b class='flag-5'>存儲</b><b class='flag-5'>引擎</b>各種不同類型的<b class='flag-5'>鎖</b>

    關于mysql存儲引擎你知道多少

    Mysql中用的最多的兩種存儲引擎就是MyISAM和InnDB,其中MyISAM是5.1版本之前的默認存儲引擎,InnoDB是5.1版本之后
    發表于 08-23 10:52 ?843次閱讀

    MySQL中的高級內容詳解

    (row-level locking),BDB 存儲引擎支持頁級鎖定(page-level locking)。各個鎖定級別的特點如下 頁級:銷和加鎖時間界于表
    的頭像 發表于 03-11 16:55 ?2192次閱讀
    MySQL中的高級內容詳解

    關于InnoDB的內存結構及原理詳解

    除此之外還聊了一下MySQL和InnoDB的日志,和兩次寫,總的來說算是一個入門級別的介紹,這篇文章就來詳細介紹一下InnoDB的內存結構。
    的頭像 發表于 04-16 16:15 ?2751次閱讀
    關于<b class='flag-5'>InnoDB</b>的內存結構及原理詳解

    innodb究竟是如何存數據的

    前言如果你使用過mysql數據庫,對它的存儲引擎innodb,一定不會感到陌生。 眾所周知,在mysql5以前,默認的存儲引擎是:mysl
    的頭像 發表于 10-09 15:41 ?1315次閱讀
    <b class='flag-5'>innodb</b>究竟是如何存數據的

    剖析MySQL InnoDB存儲原理(下)

    一、InnoDB存儲引擎內存管理 1.1 概念: Buffer Pool:預分配的內存池; Page:Buffer Pool的最小單位; Free list:空閑Page組成的鏈表;
    的頭像 發表于 02-15 15:47 ?390次閱讀
    剖析MySQL <b class='flag-5'>InnoDB</b><b class='flag-5'>存儲</b>原理(下)

    MySQL中的InnoDB是什么?

    有許多強大的MySQL存儲引擎可供我們使用,而InnoDB無疑是最受歡迎的存儲引擎之一。它高度可靠和高效,因此它成為5.5版本以后所有MyS
    的頭像 發表于 04-13 09:09 ?710次閱讀

    讀寫的實現原理規則

    )和不加鎖狀態(見),一次只有一個線程可以占有寫模式的讀寫,但是可以有多個線程同時占有讀模式的讀寫。因此可知,讀寫比互斥鎖具有更高的并行性! 讀寫
    的頭像 發表于 07-21 11:21 ?865次閱讀
    讀寫<b class='flag-5'>鎖</b>的實現原理<b class='flag-5'>規則</b>