最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL行鎖、間隙鎖和臨鍵鎖示例詳解

 更新時(shí)間:2025年11月10日 09:59:59   作者:tanxinji  
InnoDB存儲(chǔ)引擎通過行鎖、間隙鎖和臨鍵鎖實(shí)現(xiàn)MVCC和基于鎖的并發(fā)控制,確保事務(wù)隔離級(jí)別和避免死鎖,本文給大家介紹MySQL行鎖、間隙鎖和臨鍵鎖,感興趣的朋友跟隨小編一起看看吧

在MySQL中,InnoDB存儲(chǔ)引擎實(shí)現(xiàn)了其自己的多版本并發(fā)控制(MVCC)機(jī)制,以及基于鎖的并發(fā)控制。InnoDB使用鎖來實(shí)現(xiàn)事務(wù)的隔離級(jí)別,其中包括行鎖(Row Locks)、間隙鎖(Gap Locks)和臨鍵鎖(Next-Key Locks)。這些鎖的類型對(duì)于理解事務(wù)的隔離級(jí)別和避免死鎖等問題非常重要。

1.行鎖 (Record Lock)

鎖住索引中的一條具體記錄。 保證原子性:防止多個(gè)事務(wù)同時(shí)修改同一條記錄
例如:SELECT * FROM t WHERE id = 10 FOR UPDATE;會(huì)在 id=10這條記錄的索引上加行鎖。

示例

-- 事務(wù)A
BEGIN;
SELECT * FROM users WHERE id = 10 FOR UPDATE;
-- 此時(shí)其他事務(wù)執(zhí)行以下操作會(huì)被阻塞:
-- UPDATE users SET name = 'new' WHERE id = 10;
-- DELETE FROM users WHERE id = 10;

2.間隙鎖(Gap Lock)

鎖住索引記錄之間的間隙,但不包括記錄本身。唯一目的就是防止其他事務(wù)在這個(gè)間隙中插入新記錄,解決幻讀問題。
它是一個(gè)開區(qū)間。例如:假設(shè)表中有 id為 5, 10, 15 的記錄。那么間隙鎖可以鎖住 (-∞, 5),(5, 10),(10, 15),(15, +∞)這些范圍。

觸發(fā)時(shí)機(jī)

(1)在可重復(fù)讀或串行化隔離級(jí)別下。
(2)唯一索引/普通索引,等值查詢,記錄不存在時(shí)。

示例

表 user,其 age字段上有普通索引

事務(wù)A:
BEGIN;
SELECT * FROM user WHERE age = 25 FOR UPDATE; 
由于 age=25不存在,InnoDB 會(huì)找到 25所在的間隙,即 (20, 30)。此時(shí),事務(wù) A 會(huì)在 (20, 30)這個(gè)間隙上加間隙鎖。
事務(wù)B:
INSERT INTO user (id, age) VALUES (10, 22); -- 阻塞。因?yàn)?22 在 (20, 30) 區(qū)間內(nèi)
INSERT INTO user (id, age) VALUES (10, 28); -- 阻塞。因?yàn)?28 在 (20, 30) 區(qū)間內(nèi)
INSERT INTO user (id, age) VALUES (10, 20); -- 成功。20 是已存在的記錄,不在間隙鎖范圍內(nèi)(但可能被記錄鎖或臨鍵鎖影響)
INSERT INTO user (id, age) VALUES (10, 30); -- 成功。30 是已存在的記錄,不在間隙鎖范圍內(nèi)
事務(wù) B 的插入操作會(huì)被阻塞,直到事務(wù) A 提交。這樣就防止了在事務(wù) A 中如果再次執(zhí)行 SELECT ... FOR UPDATE可能會(huì)看到新插入的 age=22或 28的記錄(幻讀)。

3.臨鍵鎖(Next-Key Lock)

行鎖 + 間隙鎖。它鎖住一條記錄和該記錄之前的間隙。它是一個(gè)左開右閉區(qū)間。臨鍵鎖是 InnoDB 默認(rèn)的行鎖模式
例如:對(duì)于記錄 id=10,它的臨鍵鎖會(huì)鎖住 (5, 10]這個(gè)區(qū)間。這意味著既不能插入 id=6的新記錄(間隙被鎖),也不能修改或刪除 id=10的記錄(記錄被鎖)。

示例

(1)等值查詢

事務(wù)A
SELECT * FROM users WHERE age = 20 FOR UPDATE;

過程:InnoDB 通過 B+ 樹找到 age=20 的記錄,并給它加上臨鍵鎖。

鎖定的范圍:(10, 20]。

為什么不是 [20, 20]?因?yàn)榕R鍵鎖的本質(zhì)是鎖“下一個(gè)鍵”之前的間隙。對(duì)于 age=20,它會(huì)鎖住 (上一個(gè)記錄的值, 20],即 (10, 20]。

(2)范圍查詢

事務(wù)A
SELECT * FROM users WHERE age BETWEEN 15 AND 25 FOR UPDATE;

找到第一條滿足條件的記錄,即 age=20。鎖住 (10, 20]。

繼續(xù)向后掃描,找到 age=30。雖然 30 不滿足條件(30 > 25),但根據(jù)規(guī)則,掃描到的記錄也要加鎖。鎖住 (20, 30]。

最終鎖定的范圍:(10, 20] 和 (20, 30]。這相當(dāng)于鎖定了整個(gè) (10, 30] 的區(qū)間。

效果:任何試圖在 age=15 到 age=30 之間插入、更新記錄的操作都會(huì)被阻塞。

(3)特殊場(chǎng)景:唯一索引等值查詢

當(dāng)使用唯一索引進(jìn)行等值查詢并且數(shù)據(jù)存在時(shí),InnoDB 會(huì)優(yōu)化,降級(jí)為僅使用行鎖。

SELECT * FROM users WHERE id = 3 FOR UPDATE;
此時(shí),InnoDB 知道 id=3 是唯一的,不需要防止幻讀,所以只會(huì)鎖住 id=3 這一條記錄本身,而不會(huì)加間隙鎖。

相關(guān)SQL語句

-- 查看當(dāng)前鎖信息
SELECT * FROM information_schema.INNODB_LOCKS;
SELECT * FROM information_schema.INNODB_LOCK_WAITS;
-- MySQL 8.0+ 性能schema鎖監(jiān)控
SELECT * FROM performance_schema.data_locks;
SELECT * FROM performance_schema.data_lock_waits;

到此這篇關(guān)于MySQL行鎖、間隙鎖和臨鍵鎖示例詳解的文章就介紹到這了,更多相關(guān)mysql行鎖,間隙鎖和臨鍵鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • winxp 安裝MYSQL 出現(xiàn)Error 1045 access denied 的解決方法

    winxp 安裝MYSQL 出現(xiàn)Error 1045 access denied 的解決方法

    自己遇到了這個(gè)問題,也找了很久才解決,就整理一下,希望對(duì)大家有幫助!
    2010-07-07
  • PHP中常用的幾個(gè) mysql操作

    PHP中常用的幾個(gè) mysql操作

    本篇文章是對(duì)關(guān)于php操作mysql執(zhí)行數(shù)據(jù)庫查詢的一些常用操作進(jìn)行了詳細(xì)的匯總介紹,非常的細(xì)致全面,也很簡(jiǎn)單,需要的朋友參考下
    2015-04-04
  • 如何在SQL Server中實(shí)現(xiàn) Limit m,n 的功能

    如何在SQL Server中實(shí)現(xiàn) Limit m,n 的功能

    本篇文章是對(duì)在SQL Server中實(shí)現(xiàn) Limit m,n功能的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • xampp中修改mysql默認(rèn)空密碼(root密碼)的方法分享

    xampp中修改mysql默認(rèn)空密碼(root密碼)的方法分享

    以前開發(fā)我一直都是用的phpnow做php開發(fā)環(huán)境,phpnow的特點(diǎn)就是一鍵安裝,安裝的時(shí)候會(huì)要求用戶輸入mysql的root密碼。今天由于客戶機(jī)器使用的xampp作為開發(fā)環(huán)境,所以碰到了修改mysql默認(rèn)空密碼的問題
    2014-04-04
  • mysql中截取字符串的6個(gè)函數(shù)講解

    mysql中截取字符串的6個(gè)函數(shù)講解

    這篇文章主要介紹了mysql中截取字符串的6個(gè)函數(shù)講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • MySQL忽略表名大小寫的2種方法實(shí)現(xiàn)

    MySQL忽略表名大小寫的2種方法實(shí)現(xiàn)

    在 MySQL 中,默認(rèn)情況下表名是大小寫敏感的,本文主要介紹了MySQL忽略表名大小寫的2種方法實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • mysql查詢鎖表的實(shí)現(xiàn)方法

    mysql查詢鎖表的實(shí)現(xiàn)方法

    本文主要介紹了mysql查詢鎖表的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • 如何解決docker無法啟動(dòng)的問題

    如何解決docker無法啟動(dòng)的問題

    這篇文章主要介紹了如何解決docker無法啟動(dòng)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • SQL函數(shù)實(shí)現(xiàn)Group_concat用法

    SQL函數(shù)實(shí)現(xiàn)Group_concat用法

    GROUP_CONCAT用于將每個(gè)分組內(nèi)的值連接成一個(gè)字符串,并通過指定的分隔符進(jìn)行分隔,本文主要介紹了SQL函數(shù)實(shí)現(xiàn)Group_concat用法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08
  • mysql 8.0.15 winx64解壓版圖文安裝教程

    mysql 8.0.15 winx64解壓版圖文安裝教程

    這篇文章主要為大家詳細(xì)介紹了mysql 8.0.15 winx64解壓版圖文安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05

最新評(píng)論

浦东新区| 淮安市| 绥棱县| 汝城县| 慈利县| 师宗县| 留坝县| 个旧市| 花莲县| 蒲城县| 油尖旺区| 孝感市| 靖边县| 镇赉县| 岳普湖县| 台山市| 曲松县| 邳州市| 南汇区| 霍林郭勒市| 阳原县| 青岛市| 彝良县| 巴林右旗| 康乐县| 泰宁县| 大余县| 三穗县| 石嘴山市| 瓦房店市| 连城县| 辽中县| 奉贤区| 江安县| 萨嘎县| 汤原县| 延长县| 新巴尔虎右旗| 彭阳县| 上高县| 宁夏|