1. 程式人生 > 其它 >Innodb中有哪些鎖?

Innodb中有哪些鎖?

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、總結

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

這就是本該拼搏的年紀,卻想得太多,做得太少!