2.3、Record Locks (索引行鎖) record lock 是一個在索引行記錄的鎖。比如,SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE,如果c1 上的索引被使用到。防止任何其他事務變動 c1 = 10 的行。
record lock 總是會在索引行上加鎖。即使一個表并沒有設置任何索引,這種時候 innoDB 會創建一個隱式的聚集索引(primary Key),然后在這個聚集索引上加鎖。
當查詢字段沒有索引時,比如 update table set columnA="A" where columnB=“B".如果 columnB 字段不存在索引(或者不是組合索引前綴),這條語句會鎖住所有記錄也就是鎖表。如果語句的執行能夠執行一個 columnB 字段的索引,那么僅會鎖住滿足 where 的行(RecordLock)。
鎖出現查看示例:
(使用 show engine innodb status 命令查看):
```范圍查詢
RECORD LOCKS space id 58 page no 3 n bits 72 index PRIMARY of table test.t
trx id 10078 lock_mode X locks rec but not gap
Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
0: len 4; hex 8000000a; asc ;;
1: len 6; hex 00000000274f; asc 'O;;
2: len 7; hex b60000019d0110; asc ;;
2.4、Gap locks(間隙鎖) Gap Locks:鎖定索引記錄之間的間隙([2]),或者鎖定一個索引記錄之前的間隙([1]),或者鎖定一個索引記錄之后的間隙([3])。
一致性讀 (就是讀取快照)select * from table .... 當前讀(就是讀取實際的持久化的數據)特殊的讀操作,插入/更新/刪除操作,屬于當前讀,處理的都是當前的數據,需要加鎖。 select from table where ? lock in share mode; select * from table where ? for update; insert; update ; delete;
注意:select ...... from where...... (沒有額外加鎖后綴)使用MVCC,保證了讀快照(MySQL 稱為 consistent read),所謂一致性讀或者讀快照就是讀取當前事務開始之前的數據快照,在這個事務開始之后的更新不會被讀到。詳細情況下文 select 的詳述。
對于加鎖讀 SELECT with FOR UPDATE (排他鎖) or LOCK IN SHARE MODE (共享鎖)、 update、delete語句,要考慮是否是唯一索引的等值查詢。