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

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

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

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

這是一個(gè)非常核心的數(shù)據(jù)庫(kù)鎖機(jī)制問(wèn)題。簡(jiǎn)單來(lái)說(shuō):排他鎖(X鎖)是"鎖什么",間隙鎖(Gap Lock)是"鎖哪里"。

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

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

?? 詳細(xì)解釋

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

-- 示例:對(duì)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) 隔離級(jí)別下有效

?? 實(shí)際工作場(chǎng)景

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

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

場(chǎng)景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有唯一索引,不會(huì)加間隙鎖
SELECT * FROM student WHERE name = 'bbbb' FOR UPDATE;
-- 只對(duì)'bbbb'這一行加排他鎖
-- 如果name沒(méi)有索引或不是唯一索引,可能會(huì)鎖全表間隙
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)險(xiǎn)

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

-- 事務(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ā)插入容易死鎖降低隔離級(jí)別為RC

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

明確使用場(chǎng)景:

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

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

索引設(shè)計(jì):

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

隔離級(jí)別選擇:

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

避免長(zhǎng)事務(wù):

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

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

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

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

到此這篇關(guān)于MySQL間隙鎖與排他鎖的區(qū)別全解析的文章就介紹到這了,更多相關(guān)mysql間隙鎖與排他鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(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ì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    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),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03
  • MySQL主鍵生成的四種方式及對(duì)比詳解

    MySQL主鍵生成的四種方式及對(duì)比詳解

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

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

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

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

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

    詳解MySQL中default的使用

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

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

    在 MySQL 數(shù)據(jù)庫(kù)的使用過(guò)程中,設(shè)置和修改 root 用戶的密碼是一項(xiàng)基本且重要的操作,root 用戶擁有數(shù)據(jù)庫(kù)的最高權(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的安裝教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • MySQL需要根據(jù)特定順序排序的實(shí)現(xiàn)方法

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

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

最新評(píng)論

上林县| 东港市| 调兵山市| 织金县| 湖南省| 原阳县| 濮阳市| 石首市| 垦利县| 新泰市| 屏山县| 聂荣县| 称多县| 澳门| 兴国县| 南汇区| 武平县| 肃宁县| 通河县| 江都市| 苗栗县| 乐亭县| 汉寿县| 临颍县| 永年县| 红安县| 安义县| 墨脱县| 泊头市| 日土县| 德阳市| 宝坻区| 德江县| 长沙县| 恭城| 策勒县| 儋州市| 滦平县| 砀山县| 武鸣县| 通河县|