色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳細(xì)總結(jié)下InnoDB存儲引擎中行鎖的加鎖規(guī)則

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

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

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

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

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

哪些語句上面會加行鎖?

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

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

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

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

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

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

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

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

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

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

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

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

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

當(dāng)我們用唯一索引進(jìn)行等值查詢的時候,根據(jù)查詢的記錄是否存在,加鎖的規(guī)則會有所不同:

當(dāng)查詢的記錄是存在的,Next-key Lock 會退化成記錄鎖

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

查詢的記錄存在

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

select*fromuser
whereid=25
forupdate;

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

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

查詢的記錄不存在

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

select*fromuser
whereid=22
forupdate;

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

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

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

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

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

select*fromuser
whereid>=20andid

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

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

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

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

當(dāng)我們用非唯一索引進(jìn)行等值查詢的時候,根據(jù)查詢的記錄是否存在,加鎖的規(guī)則會有所不同:

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

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

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

查詢的記錄存在

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

select*fromuser
wherea=16
forupdate;

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

又因?yàn)槭欠俏ㄒ凰饕戎挡樵?,且查詢的記?a= 16 是存在的,所以還會加上間隙鎖,規(guī)則是向下遍歷到第一個不符合條件的值才能停止,因此間隙鎖的范圍是 (16,32)

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

查詢的記錄不存在

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

select*fromuser
wherea=18
forupdate;

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

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

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

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

select*fromuser
wherea>=16anda

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

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

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






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    768

    瀏覽量

    44175
  • GAP
    GAP
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    8313
  • DML模型
    +關(guān)注

    關(guān)注

    0

    文章

    4

    瀏覽量

    6037

原文標(biāo)題:美團(tuán):這個 SQL 語句加了哪些鎖?

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

收藏 人收藏

    評論

    相關(guān)推薦

    深度剖析MySQL/InnoDB的并發(fā)控制和加鎖技術(shù)

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

    allegro 差分對規(guī)則設(shè)置

    自己總結(jié)下差分對規(guī)則的設(shè)置
    發(fā)表于 03-01 01:48

    詳解Mysql數(shù)據(jù)庫InnoDB存儲引擎事務(wù)

    關(guān)于Mysql數(shù)據(jù)庫InnoDB存儲引擎事務(wù)的一點(diǎn)理解
    發(fā)表于 05-13 10:11

    InnoDB的特點(diǎn)和狀態(tài)查詢

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

    MySQL存儲引擎簡析

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

    總結(jié)下單片機(jī)的這幾種架構(gòu)

    “從畢業(yè)到工作的這10年的時間,自己使用的單片機(jī)架構(gòu)也在升級,從最初的前后臺順序執(zhí)行到時間片輪轉(zhuǎn)調(diào)度再到現(xiàn)在RTOS,下面就結(jié)合一些案例來總結(jié)下這幾種架構(gòu)吧”01—前后臺順序法這種方法,...
    發(fā)表于 12-09 07:04

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

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

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

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

    關(guān)于mysql存儲引擎你知道多少

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

    MySQL中的高級內(nèi)容詳解

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

    關(guān)于InnoDB的內(nèi)存結(jié)構(gòu)及原理詳解

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

    innodb究竟是如何存數(shù)據(jù)的

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

    剖析MySQL InnoDB存儲原理(下)

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

    MySQL中的InnoDB是什么?

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

    讀寫的實(shí)現(xiàn)原理規(guī)則

    )和不加鎖狀態(tài)(見),一次只有一個線程可以占有寫模式的讀寫,但是可以有多個線程同時占有讀模式的讀寫。因此可知,讀寫比互斥鎖具有更高的并行性! 讀寫
    的頭像 發(fā)表于 07-21 11:21 ?928次閱讀
    讀寫<b class='flag-5'>鎖</b>的實(shí)現(xiàn)原理<b class='flag-5'>規(guī)則</b>
    主站蜘蛛池模板: 99热在线观看精品| 国产精品一区二区制服丝袜| 一本道本线中文无码| 亚洲熟少妇在线播放999| 亚洲你我色| 在线观看日本污污ww网站| 中文字幕一区在线观看视频| 0855福利| av狼新人开放注册区| 高干紧射H后入| 国产精品久久大陆| 近亲乱中文字幕| 麻豆精品无码久久久久久久久 | 一区二区视频在线观看高清视频在线 | 97人人碰免费视频公开| GAY东北澡堂激情2022| 高清欧美性猛交xxxx黑人猛交| 国产色精品久久人妻无码看片软件| 火影小南被爆羞羞网站| 龙广在线收听| 日韩亚洲国产欧美免费观看| 亚洲AV人无码综合在线观看蜜桃| 一二三四高清中文版视频| 91免费网站在线看入口黄| 成人综合在线观看| 果冻传媒2021精品在线观看| 蜜柚免费视频高清观看在线| 日韩精品 中文字幕 有码| 亚洲精品久久久久一区二区三| 综合伊人久久| 囯产免费久久久久久国产免费 | 在线欧美精品一区二区三区| 99热成人精品国产免男男| 国产精品99久久久久久WWW| 久久草福利自拍视频在线观看| 欧洲最大无人区免费高清完整版 | 久久99这里只有精品| 人妻少妇偷人精品无码洋洋AV | 蜜桃麻豆WWW久久囤产精品免费 | 久久国语精品| 日日噜噜噜夜夜爽爽狠狠|