InnoDB鎖定模式
事務獲取鎖,以防止並發事務修改甚至讀取某些行或行范圍。這樣做是為了確保並發寫入操作不會沖突。
共享鎖(S)和排他鎖(X)
兩種標准的行級鎖是共享鎖(S)和排他鎖(X)
獲取共享鎖以讀取行,並允許其他事務讀取鎖定的行,但不能寫入鎖定的行。其他事務也可能獲取自己的共享鎖。
獲得排他鎖以寫入一行,並阻止其他事務鎖定同一行。它的具體行為取決於隔離級別;默認值(REPEATABLE READ可重復讀),允許其他事務從排他鎖定的行讀取。
意向鎖
InnoDB還允許表鎖定,並允許表和行級別的鎖定優雅地共存,存在一系列稱為意圖鎖的鎖。
意向共享鎖(IS)表示事務打算設置共享鎖。
意向排他鎖(IX)表示事務打算設置排他鎖。
是否授予鎖定可以總結如下:
- 如果持有其他任何鎖(X,S,IX,IS),則不授予X鎖。
- 如果持有X或IX鎖,則不授予S鎖。如果持有S或IS鎖,則將授予此權限。
- 如果持有X或S鎖,則不授予IX鎖。如果持有IX或IS鎖,則將授予此權限。
- 如果持有X鎖,則不授予IS鎖。如果持有S,IX或IS鎖,則將授予此權限。
間隙鎖
使用innodb_locks_unsafe_for_binlog的默認設置和默認隔離級別REPEATABLE READ,將使用一種稱為間隙鎖定的方法。當InnoDB在記錄上設置共享或排他鎖時,它實際上在索引記錄上。記錄將具有內部InnoDB索引,即使它們沒有定義唯一索引也是如此。同時,在索引記錄之前的間隙上保持了鎖定,因此另一個事務無法在該記錄與先前記錄之間的間隙中插入新的索引記錄。
間隙可以是一個索引值,也可以是多個索引值,或者根本不存在,這取決於索引的內容。如果一條語句使用唯一索引的所有列來搜索唯一行,則不使用間隙鎖定。
類似於上述共享和排他意圖鎖,可以有多種類型的間隙鎖。這些包括共享間隙鎖,排他間隙鎖,意圖共享間隙鎖和意圖排他間隙鎖。
如果設置了innodb_locks_unsafe_for_binlog系統變量,或者隔離級別設置為READ COMMITTED,則禁用間隙鎖。