Innodb中有哪些鎖?

玉樹臨楓發表於2021-07-10

0、前言

上一篇從MySQL層面上了解鎖,那麼這篇我們從儲存引擎上來了解, 以MySQL預設儲存引擎Innodb來說,看看有哪些鎖?(MySQL版本為8)

 

1、Shared and Exclusive Locks  -- 共享鎖和排他鎖

    兩者都是行級鎖;

    Shared Lock -- 共享鎖(S), 也稱為讀鎖。允許多個事務同一時刻併發讀取同一記錄,互不干擾。但不允許再加排他鎖。

加鎖方式:select * from table where xxx for share;

  

   Exclusive Lock -- 排他鎖(X),也稱寫鎖。一個寫鎖會阻塞其它的寫鎖或讀鎖,保證同一時刻只有一個事務可以寫入資料。

加鎖方式:select * from table where xxx for update;

  

    這裡要注意下:

  •     如果沒有指定某行,而掃描了表中的所有記錄,則相當於表級鎖了。

  •     在其他事務中沒有操作的前提下,同一事務中是可以同時擁有某行的共享鎖和排他鎖的。

     

    下面是的排他鎖和共享鎖的相容性。

 

X

S

X

互斥

互斥

S

互斥

相容

 

 

2、Intention Locks -- 意向鎖

    表級鎖,指示事務稍後對錶中的行需要哪種型別的鎖(排他鎖或共享鎖)。所以又分為兩種型別的意向鎖。

 

    IS(Intention Shared Lock):意向共享鎖,表示事務打算在表中的各個行上設定共享鎖。

    IX(Intention Exclusive Lock): 意向排他鎖,表示事務打算在表中的各個行上設定排他鎖。

    

    意向鎖定協議如下:

    在事務可以獲取表中某行上的共享鎖/排他鎖之前,它必須首先獲取該表上的意向共享鎖/意向排他鎖。例如:

  • select ... for share   需要先獲取IS鎖

  • select ... for update 需要先獲取IX鎖

 

  下面是表級別的鎖型別相容性。

 

X

IX

S

IS

X

互斥

互斥

互斥

互斥

IX

互斥

相容

互斥

相容

S

互斥

互斥

相容

相容

IS

互斥

相容

相容

相容


  如果鎖與現有鎖衝突,則不授予該鎖。

  特別注意

  • 意向鎖除了全表請求(例如:Lock tables ... write)外,不阻止任何其他內容。

  • 意向鎖的主要目的是表明有人正在鎖定表中的行,或者將要鎖定表中的行。

     

3、Record Locks -- 記錄鎖

    記錄鎖是對索引記錄的鎖定。例如

select c1 from t where c1 = 10 for update;

    表示防止任何其他事務插入、更新或刪除t.c1=10的行。

 

4、Gap Locks -- 間隙鎖

    間隙鎖是對索引記錄之間的間隙的鎖定。例如:

select c1 from t where c1 between 10 and 20 for update;

    表示防止其他事務動(插入、更新或刪除)t.c1在10~20中的記錄。

    

    特別注意:

  • 間隙鎖是可以共存的。例如:事務A在間隙上新增一個間隙共享鎖(Gap S-Lock),事務B可以在同一間隙上增加間隙排他鎖(Gap X-Lock)

  • 間隙鎖可以禁用。修改事務隔離級別至RC 或者 啟用系統變數innodb_locks_unsafe_for_binlog 

     

5、Next-Key Locks -- 下一個鍵鎖

    下一個鍵鎖又稱臨界鎖,是索引記錄上的記錄鎖和索引記錄之前的間隙上的間隙鎖的組合。即Next-Key Lock 包含 Record Lock 和 Gap Lock。

    預設情況下,InnoDB在可重複讀取事務隔離級別下執行。在這種情況下,InnoDB使用next鍵鎖進行搜尋和索引掃描,從而防止幻讀。

 

6、Insert Intension Locks -- 插入意向鎖

    插入意向鎖是在行插入之前由插入操作設定的一種間隙鎖。

 

7、AUTO-INC Locks -- 自增鎖

    AUTO-INC鎖是一種特殊的表級鎖,由插入到具有自動增量列的表中的事務使用。

 

8、總結

 

 

本次只是說明下相關概念, 下篇文章說下各種鎖的實際用法,怎麼檢視加了什麼鎖,什麼情況下會加什麼鎖。

相關文章