InnoDB鎖可以劃分為行鎖和表鎖
官方文檔:https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html
行鎖有以下的幾種:
- 共享鎖與排他鎖(Shared and Exclusive Lock)
- 記錄鎖(Record Lock)
- 間隙鎖(Gap Lock)
- 記錄鎖與間隙鎖的組合(Next-Key Lock)
- 插入意向鎖(Insert Intention Lock)
表鎖有以下幾種:
- 意向鎖(Intention Lock)
- 自增鎖(AUTO-INC Lock)
行鎖
1.共享鎖【S】和排它鎖【X】
- 普通查詢不會添加任何鎖
- 當讀取一行記錄時萨驶,為了防止別人修改,則需要添加S鎖萍聊。
- 當修改記錄時,為了防止別人同時進行修改迷帜,則需要添加X鎖适秩。
# 手動添加S鎖
SELECT ... LOCK IN SHARE MODE # 8.0前
SELECT… FOR SHARE # 8.0
# 手動添加X鎖
SELECT… FOR UPDATE
2.記錄鎖(Record Lock)
在MySQL中記錄鎖都是添加在索引上的,即使表中沒有索引乱投,也會在默認創(chuàng)建的聚集索引上添加記錄鎖送爸。
3.間隙鎖(Gap Lock)
間隙鎖的鎖定范圍是索引記錄之間的間隙唧躲,或者第一條或最后一條索引記錄之前的間隙,間隙鎖是針對事務(wù)隔離級別為RR或以上級別的碱璃。
4.記錄鎖與間隙鎖的組合【Next-Key Lock】
Next-Key Lock 是索引記錄本身加上之前的間隙。間隙鎖保證在REPEATABLE-READ級別下不會出現(xiàn)幻讀現(xiàn)象饭入,防止在同一個事務(wù)內(nèi)得到的結(jié)果不一致嵌器。
5.插入意向鎖(Insert Intention Lock)
插入意向鎖是針對INSERT操作設(shè)置的一種特殊的間隙鎖,主要是為了優(yōu)化INSERT操作的并發(fā)能力谐丢。這個鎖表示插入的意圖爽航,即插入具有相同索引間隙的多個事務(wù),如果插入的值不同乾忱,則不需要互相等待讥珍。插入意向鎖之間是不沖突的,但是插入意向鎖可能和其他鎖是沖突的窄瘟,比如Next-Key Lock衷佃。
表鎖
1.意向鎖(Intention Lock)
意向鎖在MySQL中是表級別鎖,表示將來要對表添加什么類型的鎖(IX/IS)蹄葱。
- SELECT… FOR SHARE氏义,添加意向共享鎖(IS)
- SELECT … FOR UPDATE锄列,添加意向排他鎖(IX)
在獲取表中某行的共享鎖之前,首先必須獲取表的IS鎖惯悠。在獲取表中某行的獨占鎖之前邻邮,首先必須獲取表的IX鎖。
2.自增鎖(AUTO-INC Lock)
自增鎖是插入到具有AUTO_INCREMENT字段的表中的事務(wù)所采用的特殊表級鎖克婶。innodb_autoinc_lock_mode參數(shù)用于控制自增鎖的算法筒严。
鎖含義
使用show engine innodb語句查看鎖信息時,會看到LOCK_MODE字段
- IX:代表意向排他鎖情萤。
- X:代表Next-Key Lock鎖定記錄本身和記錄之前的間隙(X)鸭蛙。
- S:代表Next-Key Lock鎖定記錄本身和記錄之前的間隙(S)。
- X, REC_NOT_GAP:代表只鎖定記錄本身(X)紫岩。
- S, REC_NOT_GAP:代表只鎖定記錄本身(S)规惰。
- X, GAP:代表間隙鎖,不鎖定記錄本身(X)泉蝌。
- S, GAP:代表間隙鎖歇万,不鎖定記錄本身(S)。
- X, GAP,INSERT_INTENTION:代表插入意向鎖勋陪。