意向共享鎖與意向排它鎖:詳解與應用

若-飞發表於2024-08-19

在資料庫系統中,鎖機制是保證資料一致性和完整性的關鍵。除了行級鎖和表級鎖外,還有一種鎖型別,它在資料庫的事務處理中扮演著重要的角色——意向鎖(Intention Locks)。在這篇部落格中,我們將詳細講解意向共享鎖(Intention Shared Lock)和意向排它鎖(Intention Exclusive Lock)的概念、作用及其應用。

什麼是意向鎖?

意向鎖是一種特殊的鎖型別,主要用於表級別的鎖管理,它的存在目的是為了避免在行級鎖和表級鎖之間發生衝突。意向鎖不會直接鎖定資料行,而是標記表中的某個資料行在未來可能會被鎖定的意圖。這種鎖幫助資料庫系統高效地管理併發事務,減少鎖衝突,提高效能。

意向鎖是表鎖,為了協調行鎖和表鎖的關係,支援多粒度(表鎖與行鎖)的鎖並存。

當有事務A有行鎖時,MySQL會自動為該表新增意向鎖,事務B如果想申請整個表的寫鎖,那麼不需要遍歷每一行判斷是否存在行鎖,而直接判斷是否存在意向鎖,增強效能。

意向共享鎖(Intention Shared Lock)

定義:意向共享鎖(IS鎖)用於表示事務計劃在未來對某些行加共享鎖。它的存在表明事務對錶中的行有意向加共享鎖,從而確保其他事務不會在表級別上加排他鎖。

方式:自動新增,新增共享鎖的時候自動加上意向共享鎖

作用

  • 鎖管理:透過在表上加意向共享鎖,資料庫可以有效地協調對行級共享鎖的請求,避免了事務直接競爭行級鎖的問題。
  • 避免衝突:意向共享鎖的存在表明事務將要對錶中的某些行加共享鎖,其他事務可以避免對錶級別的排他鎖進行操作。

示例: 假設有兩個事務:事務A希望對錶中的某些行加共享鎖,而事務B希望對整個表加排他鎖。為了防止衝突,事務A會首先在表上加意向共享鎖,事務B在嘗試獲取表級排他鎖時,會檢查表上是否有意向共享鎖,以決定是否可以獲取鎖。

START TRANSACTION;

-- 事務A請求意向共享鎖
SELECT * FROM products WHERE product_id = 1 LOCK IN SHARE MODE;

-- 事務B嘗試獲取排他鎖
-- 事務B會檢查表上是否存在意向共享鎖,如果存在,可能會等待或回滾
LOCK TABLES products WRITE;

COMMIT;

意向排它鎖(Intention Exclusive Lock)

定義:意向排它鎖(IX鎖)用於表示事務計劃在未來對某些行加排他鎖。它的存在表明事務對錶中的行有意向加排他鎖,從而阻止其他事務對這些行加共享鎖或排他鎖。

作用

  • 鎖管理:透過在表上加意向排它鎖,資料庫可以有效地協調對行級排他鎖的請求,避免了事務直接競爭行級鎖的問題。
  • 避免衝突:意向排它鎖的存在表明事務將要對錶中的某些行加排他鎖,其他事務可以避免對錶級別的共享鎖進行操作。

方式:自動新增,新增排它鎖的時候自動加上意向排它鎖

示例: 假設有兩個事務:事務A希望對錶中的某些行加排他鎖,而事務B希望對整個表加共享鎖。為了防止衝突,事務A會首先在表上加意向排它鎖,事務B在嘗試獲取表級共享鎖時,會檢查表上是否有意向排它鎖,以決定是否可以獲取鎖。

START TRANSACTION;

-- 事務A請求意向排它鎖
SELECT * FROM products WHERE product_id = 1 FOR UPDATE;

-- 事務B嘗試獲取共享鎖
-- 事務B會檢查表上是否存在意向排它鎖,如果存在,可能會等待或回滾
LOCK TABLES products READ;

COMMIT;

意向鎖的作用

  1. 最佳化鎖管理:意向鎖幫助資料庫系統高效地管理鎖定請求,減少鎖衝突和死鎖的可能性。
  2. 提高併發性:透過在表級別和行級別使用意向鎖,資料庫系統能夠更好地處理併發事務,提高併發效能。
  3. 減少鎖競爭:意向鎖減少了事務在嘗試獲取鎖時的直接競爭,允許事務在表級別和行級別之間有序地進行鎖定。

實戰注意:這裡的排它 / 共享鎖指的都是表鎖!!!意向鎖不會與行級的共享 / 排它鎖互斥!!!

  session1獲取了某一行的排他鎖,並未提交:

select*from goods where id=1 for update;

  此時 goods 表存在兩把鎖:goods 表上的意向排它鎖與 id 為 1 的資料行上的排它鎖。

  session2 想要獲取 goods 表的共享鎖:

LOCK TABLES goods READ;

  此時session2 檢測session1 持有goods 表的意向排他鎖,就可以得知session1必然持有該表中某些資料行的排他鎖,那麼session2 對 goods 表的加鎖請求就會被排斥(阻塞),而無需去檢測表中的每一行資料是否存在排它鎖。

  意向共享鎖與意向排它鎖:詳解與應用

  意向共享鎖與意向排它鎖:詳解與應用

總結

意向共享鎖和意向排它鎖是資料庫鎖機制中的重要組成部分。它們透過在表級別標記事務的鎖定意圖,幫助資料庫系統更有效地管理併發事務,減少鎖衝突,提高效能。理解意向鎖的概念和應用場景,有助於更好地設計和最佳化資料庫事務處理策略,從而提高資料庫系統的併發能力和資料一致性。

相關文章