欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

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

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

jf_ro2CN3Fa ? 來(lái)源:飛天小牛肉 ? 2023-02-21 14:02 ? 次閱讀

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

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

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

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

哪些語(yǔ)句上面會(huì)加行鎖?

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

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

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

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

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

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

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

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

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

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

假設(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)行等值查詢的時(shí)候,根據(jù)查詢的記錄是否存在,加鎖的規(guī)則會(huì)有所不同:

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

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

查詢的記錄存在

先來(lái)看個(gè)查詢的記錄存在的案例:

select*fromuser
whereid=25
forupdate;

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

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

查詢的記錄不存在

再來(lái)看查詢的記錄不存在的案例:

select*fromuser
whereid=22
forupdate;

結(jié)合加鎖的兩條核心:查找過程中訪問到的對(duì)象才會(huì)加鎖 + 加鎖的基本單位是 Next-key Lock(左開右閉),我們可以分析出,這條語(yǔ)句的加鎖范圍是 (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]

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

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

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

select*fromuser
whereid>=20andid

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

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

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

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

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

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

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

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

查詢的記錄存在

先來(lái)看個(gè)查詢的記錄存在的案例:

select*fromuser
wherea=16
forupdate;

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

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

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

查詢的記錄不存在

再來(lái)看查詢的記錄不存在的案例:

select*fromuser
wherea=18
forupdate;

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

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

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

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

select*fromuser
wherea>=16anda

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

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

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






審核編輯:劉清

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

    關(guān)注

    1

    文章

    775

    瀏覽量

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

    關(guān)注

    0

    文章

    15

    瀏覽量

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

    關(guān)注

    0

    文章

    4

    瀏覽量

    6054

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

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

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

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

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

    MySQL存儲(chǔ)引擎簡(jiǎn)析

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    剖析MySQL InnoDB存儲(chǔ)原理(下)

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

    MySQL中的InnoDB是什么?

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

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

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