日韩欧美国产精品免费一二-日韩欧美国产精品亚洲二区-日韩欧美国产精品专区-日韩欧美国产另-日韩欧美国产免费看-日韩欧美国产免费看清风阁

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

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

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

在 MySQL 的 InnoDB 存儲引擎中,非唯一索引觸發(fā)間隙鎖的核心原因是為了 防止幻讀(Phantom Read),尤其是在 REPEATABLE READ(可重復讀)隔離級別下。以下從原理、場景和示例詳細解釋:


1. 間隙鎖的作用

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

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


2. 非唯一索引的結構特點

非唯一索引允許存在重復的鍵值,因此索引樹中可能存在多個相同鍵值的記錄。
當通過非唯一索引查詢時,InnoDB 無法僅通過鎖定單一行來避免幻讀,因為其他事務可能在 相同的鍵值范圍內插入新數據

示例數據:

假設表 users 的 age 是非唯一索引,數據如下:

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

索引 age 的結構(按升序排列):

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

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

場景 1:等值查詢(age = 25

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

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

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

場景 2:范圍查詢(age > 20

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

4. 對比唯一索引的行為

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

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

例外:唯一索引的范圍查詢仍會觸發(fā)間隙鎖:

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

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

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

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

方案 1:改用 READ COMMITTED 隔離級別

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

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

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

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

方案 3:縮短事務時間

盡快提交事務,減少鎖持有時間。


總結

非唯一索引觸發(fā)間隙鎖的本質是 防止在重復鍵值范圍內插入新數據導致幻讀。理解這一機制有助于:

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

?轉自https://juejin.cn/post/7475688052909899802


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

主站蜘蛛池模板: 国产婷婷高清在线视频站 | 国产午夜福利电影免费在线观看 | 极品尤物一区二区三区 | 日本x片成年免费观看视频 性开放的欧美大片黑白配 欧美激合综图片区小说 | 中文字幕不卡高 | 在线不卡中文字幕 | 果冻传媒网站入口 | 欧美日韩免费观看 | 欧美第一夜 | 亚洲最新精品每日一更新 | 免费人成在线观看网站体验站 | 中文字幕日韩经典 | 九一影视 | 级a毛一级a看免费视频 | 日韩精品国产一区 | 在线第一页 | 99视频都是精品热在 | 老司机99视频在线免费观看 | 日韩欧美精品综合一区二区三 | 久在线精品视频线观看 | 国产乱码一区二区三区爽爽爽 | 欧美二区在线观看 | 青苹果乐园影院在线播放 | 国产一区成人 | 亚洲国产精品va在线观看无 | 亚洲国产高清 | 精品国产午夜福利精品推荐 | 国产97盗摄视频一区二区三区 | 国产探花| 片在线播放 | 91精品全国免费观看含羞草 | 日本日本乱码伦视频在线 | 五月天丁香婷深爱综合网 | x8x8国产在线最新地址 | 国产美女一区二区三区 | 三年片最新电影免费观看 | 欧美精品黑人粗 | 国产在线脚交免费网站脚丫 | 亚洲人成网站观看在线播放 | 国产无内肉丝精品视频 | 国产网红女主播精品视频 |