91网首页-91网页版-91网在线观看-91网站免费观看-91网站永久视频-91网站在线播放

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

為什么非唯一索引會(huì)觸發(fā)間隙鎖?

freeflydom
2025年3月6日 9:52 本文熱度 786

在 MySQL 的 InnoDB 存儲(chǔ)引擎中,非唯一索引觸發(fā)間隙鎖的核心原因是為了 防止幻讀(Phantom Read),尤其是在 REPEATABLE READ(可重復(fù)讀)隔離級(jí)別下。以下從原理、場(chǎng)景和示例詳細(xì)解釋?zhuān)?/p>


1. 間隙鎖的作用

間隙鎖(Gap Lock)是 InnoDB 在索引記錄之間的 間隙(Gap) 上施加的鎖,用于阻止其他事務(wù)在這些間隙中插入新數(shù)據(jù),從而保證事務(wù)執(zhí)行期間查詢(xún)結(jié)果集的一致性。

示例場(chǎng)景
假設(shè)事務(wù) A 執(zhí)行 SELECT * FROM users WHERE age = 25 FOR UPDATE,若 age 是非唯一索引,InnoDB 會(huì)鎖定 age = 25 的所有記錄以及相鄰的間隙,阻止其他事務(wù)插入 age = 25 的新記錄。


2. 非唯一索引的結(jié)構(gòu)特點(diǎn)

非唯一索引允許存在重復(fù)的鍵值,因此索引樹(shù)中可能存在多個(gè)相同鍵值的記錄。
當(dāng)通過(guò)非唯一索引查詢(xún)時(shí),InnoDB 無(wú)法僅通過(guò)鎖定單一行來(lái)避免幻讀,因?yàn)槠渌聞?wù)可能在 相同的鍵值范圍內(nèi)插入新數(shù)據(jù)

示例數(shù)據(jù):

假設(shè)表 users 的 age 是非唯一索引,數(shù)據(jù)如下:

+----+-----+
| id | age |
+----+-----+
| 1  | 20  |
| 3  | 25  |
| 5  | 25  | 
| 7  | 30  |
+----+-----+

索引 age 的結(jié)構(gòu)(按升序排列):

(20) → (25) → (25) → (30)

3. 非唯一索引觸發(fā)間隙鎖的場(chǎng)景

場(chǎng)景 1:等值查詢(xún)(age = 25

-- 事務(wù) A
BEGIN;
SELECT * FROM users WHERE age = 25 FOR UPDATE;
  • 鎖定范圍

    1. 行鎖:鎖定所有 age = 25 的記錄(id=3 和 id=5)。
    2. 間隙鎖:鎖定 age = 25 的前后間隙:
      • 左間隙:(20, 25)
      • 右間隙:(25, 30)
  • 其他事務(wù)插入 age = 25 的新數(shù)據(jù)會(huì)被阻塞

    -- 事務(wù) B(阻塞)
    INSERT INTO users (id, age) VALUES (6, 25);
    

場(chǎng)景 2:范圍查詢(xún)(age > 20

-- 事務(wù) A
BEGIN;
SELECT * FROM users WHERE age > 20 FOR UPDATE;
  • 鎖定范圍
    1. 行鎖:鎖定 age = 25 和 age = 30 的記錄。
    2. 間隙鎖:鎖定所有符合條件的間隙:
      • (20, 25)(25, 25)(25, 30)(30, +∞)

4. 對(duì)比唯一索引的行為

如果是 唯一索引(如主鍵 id),等值查詢(xún)不會(huì)觸發(fā)間隙鎖:

-- 事務(wù) A
BEGIN;
SELECT * FROM users WHERE id = 3 FOR UPDATE;
  • 鎖定范圍:僅鎖定 id = 3 的行,不涉及間隙鎖。
  • 其他事務(wù)插入 id = 4 不會(huì)被阻塞
    -- 事務(wù) B(成功)
    INSERT INTO users (id, age) VALUES (4, 25);
    

例外:唯一索引的范圍查詢(xún)?nèi)詴?huì)觸發(fā)間隙鎖:

-- 事務(wù) A
BEGIN;
SELECT * FROM users WHERE id > 3 FOR UPDATE;
  • 鎖定 id > 3 的所有行和間隙(如 (3, 5)(5, 7)(7, +∞))。

5. 為什么非唯一索引必須加間隙鎖?

  • 防止幻讀:如果僅鎖定現(xiàn)有行,其他事務(wù)可以在間隙中插入相同鍵值的新數(shù)據(jù),導(dǎo)致事務(wù) A 的后續(xù)查詢(xún)出現(xiàn)“幻行”。
  • 保證可重復(fù)讀:事務(wù) A 在多次查詢(xún)同一范圍時(shí),結(jié)果集必須一致。

6. 如何避免非唯一索引的間隙鎖?

方案 1:改用 READ COMMITTED 隔離級(jí)別

在 READ COMMITTED 級(jí)別下,InnoDB 不使用間隙鎖(僅行鎖),但可能產(chǎn)生幻讀:

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

方案 2:優(yōu)化查詢(xún)條件

盡量使用 唯一索引 或 精確匹配,減少范圍查詢(xún)。

方案 3:縮短事務(wù)時(shí)間

盡快提交事務(wù),減少鎖持有時(shí)間。


總結(jié)

非唯一索引觸發(fā)間隙鎖的本質(zhì)是 防止在重復(fù)鍵值范圍內(nèi)插入新數(shù)據(jù)導(dǎo)致幻讀。理解這一機(jī)制有助于:

  1. 合理設(shè)計(jì)索引(優(yōu)先使用唯一索引)。
  2. 在高并發(fā)場(chǎng)景下優(yōu)化鎖競(jìng)爭(zhēng)(如選擇 READ COMMITTED)。
  3. 避免大范圍查詢(xún)對(duì)性能的影響。

?轉(zhuǎn)自https://juejin.cn/post/7475688052909899802


該文章在 2025/3/6 9:52:59 編輯過(guò)
關(guān)鍵字查詢(xún)
相關(guān)文章
正在查詢(xún)...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專(zhuān)業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶(hù)的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 午夜福利久 | 国一产区视频 | 午夜免费福利不 | 国产熟女自拍 | 玖玖福利 | 国内精品免费视频 | 日本影片一区二区 | 日本特黄特黄 | 国产91在 | 国产福利高颜 | 岛国三级在| 日本一本之道 | 成人福利在线观看 | 欧美日韩精品一 | 午夜福利免费体验区 | 国产传媒一 | 国产91色在线 | 最新在线观看视频国产91 | 午夜福利小视频 | 国产最新电影在线观 | 日本强伦姧 | 国产精品日韩免费看 | 国产精品手机在线 | 国产国语一级 | 成人午夜电影 | 九草免费在线观看 | 91欧美日韩91桃 | 日韩中文高清一 | 成人免费观看视频 | 国产在线观看稀有 | 91福利导航大全 | 91探花| 麻婆豆传| 成人试看一区 | 日本三级香港 | 国产日韩欧美在线 | 日韩精品高清在线 | 日本免费一二 | 国产乱子伦在线视频 | 国产视频三区 | 天美传媒官方网站 |