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

MySQL間隙鎖與排他鎖的區(qū)別全解析

 更新時間:2026年01月30日 09:26:56   作者:伐塵  
本文給大家介紹了MySQL間隙鎖與排他鎖的區(qū)別,文章提到了間隙鎖在實(shí)際工作中的應(yīng)用場景和注意事項(xiàng),建議根據(jù)具體需求選擇合適的鎖機(jī)制,感興趣的朋友跟隨小編一起看看吧

【MySQL】間隙鎖 與 排他鎖 的區(qū)別

這是一個非常核心的數(shù)據(jù)庫鎖機(jī)制問題。簡單來說:排他鎖(X鎖)是"鎖什么",間隙鎖(Gap Lock)是"鎖哪里"

?? 核心區(qū)別對比表

特性排他鎖 (X鎖)間隙鎖 (Gap Lock)
鎖的類型鎖類型 - 定義鎖的"權(quán)限"鎖范圍 - 定義鎖的"位置"
作用對象已存在的數(shù)據(jù)行數(shù)據(jù)行之間的間隙
兼容性與任何其他鎖都不兼容與其他間隙鎖兼容,但與插入意向鎖沖突
主要目的防止其他事務(wù)讀寫數(shù)據(jù)防止其他事務(wù)在范圍內(nèi)插入新數(shù)據(jù)
可見范圍行記錄本身索引記錄之間的"空隙"
何時使用UPDATE、DELETE、SELECT…FOR UPDATE可重復(fù)讀隔離級別下的范圍查詢

?? 詳細(xì)解釋

1. 排他鎖(X鎖)- 行級鎖

-- 示例:對uid=8的行加排他鎖
SELECT * FROM student WHERE uid = 8 FOR UPDATE;
-- 或
UPDATE student SET age = 60 WHERE uid = 8;

特點(diǎn):

  • 鎖定具體的數(shù)據(jù)行
  • 其他事務(wù)不能讀?。⊿ELECT…FOR UPDATE)也不能修改(UPDATE/DELETE)該行
  • 可以看作"寫鎖"

2. 間隙鎖(Gap Lock)- 范圍鎖

-- 示例:鎖定uid在(5, 10)之間的所有間隙
SELECT * FROM student WHERE uid BETWEEN 6 AND 9 FOR UPDATE;
-- 或
SELECT * FROM student WHERE uid > 5 AND uid < 10 FOR UPDATE;

假設(shè)你的表數(shù)據(jù):

uid: 1, 2, 3, 4, 5, 7, 8, 10, 11

間隙包括:(-∞,1), (1,2), (2,3), …, (5,7), (7,8), (8,10), (10,11), (11,+∞)

特點(diǎn):

  • 鎖定索引記錄之間的空隙,而不是記錄本身
  • 防止其他事務(wù)在范圍內(nèi)插入新數(shù)據(jù)
  • 只在可重復(fù)讀(REPEATABLE-READ) 隔離級別下有效

?? 實(shí)際工作場景

場景1:防止幻讀(Phantom Read)

-- 事務(wù)一
BEGIN;
SELECT * FROM student WHERE age BETWEEN 20 AND 30 FOR UPDATE;
-- 鎖定所有age在20-30之間的間隙
-- 事務(wù)二嘗試插入age=25的新記錄(會被阻塞)
INSERT INTO student (name, age, sex) VALUES ('new_student', 25, 'M');

場景2:組合使用 - 臨鍵鎖(Next-Key Lock)

MySQL 實(shí)際上經(jīng)常使用 **臨鍵鎖 = 記錄鎖 + 間隙鎖**
-- 鎖定uid=8的行及其前后的間隙
SELECT * FROM student WHERE uid = 8 FOR UPDATE;
-- 實(shí)際鎖定:(7, 8] 和 (8, 10)

?? 重要注意事項(xiàng)

1. 間隙鎖只作用于非唯一索引

-- 如果name有唯一索引,不會加間隙鎖
SELECT * FROM student WHERE name = 'bbbb' FOR UPDATE;
-- 只對'bbbb'這一行加排他鎖
-- 如果name沒有索引或不是唯一索引,可能會鎖全表間隙
SELECT * FROM student WHERE name LIKE 'b%' FOR UPDATE;

2. 查看鎖信息

-- 查看當(dāng)前的鎖(MySQL 8.0+)
SELECT 
    engine_transaction_id as trx_id,
    lock_type,
    lock_mode,
    lock_data,
    index_name
FROM performance_schema.data_locks 
WHERE object_name = 'student';

3. 死鎖風(fēng)險

間隙鎖容易導(dǎo)致死鎖,特別是并發(fā)插入時:

-- 事務(wù)A
BEGIN;
SELECT * FROM student WHERE uid = 15 FOR UPDATE; -- 間隙鎖(10, +∞)
-- 事務(wù)B  
BEGIN;
SELECT * FROM student WHERE uid = 16 FOR UPDATE; -- 間隙鎖(10, +∞)
-- 事務(wù)A
INSERT INTO student (uid, name) VALUES (15, 'test'); -- 等待B
-- 事務(wù)B
INSERT INTO student (uid, name) VALUES (16, 'test'); -- 等待A → 死鎖!

?? 性能影響與優(yōu)化

情況影響解決方案
全表間隙鎖鎖住所有間隙,并發(fā)極差使用唯一索引查詢
范圍查詢鎖住大范圍間隙縮小查詢范圍
批量操作可能鎖大量間隙分批次操作
高并發(fā)插入容易死鎖降低隔離級別為RC

?? 最佳實(shí)踐建議

明確使用場景:

需要防止幻讀 → 使用間隙鎖(RR隔離級別)

只需要防止數(shù)據(jù)修改 → 使用行級排他鎖

索引設(shè)計:

-- 好的設(shè)計:使用唯一索引避免不必要的間隙鎖
CREATE UNIQUE INDEX idx_uid ON student(uid);
-- 查詢時使用唯一索引
SELECT * FROM student WHERE uid = 8 FOR UPDATE; -- 只鎖一行

隔離級別選擇:

-- 如果不需要防止幻讀,使用讀已提交
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- 此時不會加間隙鎖

避免長事務(wù):

-- 盡快提交事務(wù),減少鎖持有時間
BEGIN;
-- 立即執(zhí)行需要加鎖的操作
SELECT ... FOR UPDATE;
UPDATE ...;
-- 盡快提交
COMMIT;

?? 總結(jié)要點(diǎn)

  1. 排他鎖是"行鎖" - 鎖已存在的數(shù)據(jù)
  2. 間隙鎖是"范圍鎖" - 鎖不存在的間隙
  3. MySQL 默認(rèn)使用 臨鍵鎖(行鎖+間隙鎖)
  4. 間隙鎖主要在 RR隔離級別 防止幻讀
  5. 設(shè)計好索引可以大大減少不必要的間隙鎖

在你的學(xué)生表例子中,如果 uid 是唯一索引,SELECT ... WHERE uid=8 FOR UPDATE 只會加行鎖。如果 name 不是唯一索引,相同的查詢可能會加間隙鎖。

到此這篇關(guān)于MySQL間隙鎖與排他鎖的區(qū)別全解析的文章就介紹到這了,更多相關(guān)mysql間隙鎖與排他鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL?8.0.29?安裝配置方法圖文教程(windows?zip版)

    MySQL?8.0.29?安裝配置方法圖文教程(windows?zip版)

    這篇文章主要為大家詳細(xì)介紹了windows?zip版MySQL?8.0.29?安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 深入Mysql字符集設(shè)置[精華結(jié)合]

    深入Mysql字符集設(shè)置[精華結(jié)合]

    深入Mysql字符集設(shè)置,建議大家看本文之前先看風(fēng)雪之隅的文章,需要的朋友可以參考下
    2012-07-07
  • MySQL5.6使用mysqldump數(shù)據(jù)備份的實(shí)現(xiàn)

    MySQL5.6使用mysqldump數(shù)據(jù)備份的實(shí)現(xiàn)

    本文主要介紹了MySQL5.6使用mysqldump數(shù)據(jù)備份的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03
  • MySQL主鍵生成的四種方式及對比詳解

    MySQL主鍵生成的四種方式及對比詳解

    在數(shù)據(jù)庫設(shè)計中,主鍵(Primary Key)的選擇至關(guān)重要,它不僅是數(shù)據(jù)行的唯一標(biāo)識,還直接影響查詢效率、數(shù)據(jù)存儲甚至系統(tǒng)架構(gòu)的擴(kuò)展性,本文給大家分析了常見四種主鍵ID生成的方式,需要的朋友可以參考下
    2025-03-03
  • MySQL?添加索引5種方式示例詳解(實(shí)用sql代碼)

    MySQL?添加索引5種方式示例詳解(實(shí)用sql代碼)

    在MySQL數(shù)據(jù)庫中添加索引可以幫助提高查詢性能,尤其是在數(shù)據(jù)量大的表中,下面給大家分享MySQL添加索引5種方式示例詳解(實(shí)用sql代碼),感興趣的朋友一起看看吧
    2025-05-05
  • 刪除MySQL中所有表的外鍵的兩種方法

    刪除MySQL中所有表的外鍵的兩種方法

    這篇文章主要介紹了刪除MySQL中所有表的外鍵的兩種方法,文中通過代碼示例講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-05-05
  • 詳解MySQL中default的使用

    詳解MySQL中default的使用

    這篇文章主要介紹了MySQL中default的使用,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-05-05
  • 設(shè)置和修改MySQL的root密碼的詳細(xì)教程

    設(shè)置和修改MySQL的root密碼的詳細(xì)教程

    在 MySQL 數(shù)據(jù)庫的使用過程中,設(shè)置和修改 root 用戶的密碼是一項(xiàng)基本且重要的操作,root 用戶擁有數(shù)據(jù)庫的最高權(quán)限,因此確保其密碼的安全性至關(guān)重要,本文將詳細(xì)介紹在不同操作系統(tǒng)環(huán)境下設(shè)置和修改 MySQL root 密碼的具體步驟,幫助你輕松掌握這一關(guān)鍵技能
    2025-05-05
  • linux下mysql 5.1 和 5.7的安裝教程

    linux下mysql 5.1 和 5.7的安裝教程

    下面小編就為大家分享一篇linux下mysql 5.1 和 5.7的安裝教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • MySQL需要根據(jù)特定順序排序的實(shí)現(xiàn)方法

    MySQL需要根據(jù)特定順序排序的實(shí)現(xiàn)方法

    在MySQL中,我們可以通過指定順序排序來在查詢結(jié)果中控制數(shù)據(jù)的排列順序,這種排序方式是非常有用的,本文就來介紹一下,感興趣的可以了解一下
    2023-11-11

最新評論

偏关县| 高台县| 广饶县| 伊通| 威海市| 德兴市| 金乡县| 安塞县| 淮滨县| 凤翔县| 孟津县| 新野县| 延津县| 桐柏县| 邻水| 广河县| 西盟| 喀什市| 梁河县| 武鸣县| 炎陵县| 漯河市| 黄石市| 白沙| 嘉峪关市| 临洮县| 无为县| 图木舒克市| 扎鲁特旗| 葫芦岛市| 黎平县| 乐昌市| 微博| 怀化市| 望谟县| 蓬莱市| 资兴市| 化隆| 南汇区| 威海市| 武隆县|