Record Lock:单个行记录上的锁(非唯一索引)
Gap Lock: 间隙锁,锁定一个范围,但不包含记录本身(可重复读)
Next-Key Lock: Gap Lock + Record Lock,锁定一个范围,并且锁定记录本身(可重复读,设计的目的是解决幻读)
在REPEATABLE COMMITTED下是Next-Key Locking的方式加锁,而在READ COMMITTED下是Record Lock,其中REPEATABLE COMMITTED在查询的列是唯一索引时,Next-key Lock 降级为Record Lock。
如果查询的字段不是索引,会升级为表锁
幻读的解决:
SELECT * FROM WHERE id>4 and id<10 FOR UPDATE; (1)
通过Next-Key Lock, 将5-9 的记录加锁,对于插入/更新 ID在 5-9 的操作,必须等待,直到(1)操作结束
eg:
insert into id,xxxx value(1,xx,..) 插入的ID=1不需要等待
insert into id,xxx2, value(6,xx..) 插入的ID=6 需要等待(1)释放锁之后才能插入
同理,对于UPDATE操作也是一致的