两个标准的行级锁:
共享锁(S Lock): 允许事务读一行数据
排他锁(X Lock):允许事务删除或更新一行数据。
表级别锁(意向锁):
意向共享锁(IS Lock),事务想要获得一张表中某几行的共享锁。
意向排他锁(IX Lock), 事务想要获得一张表中某几行的排他锁。
InnoDB存储引擎有3中行锁的算法:
- Record Lock:单个行记录上的锁
- Gap Lock : 间隙锁,锁定一个范围,但不包含记录本身。
- Next--Key Lock : Gap Lock + Record Lock,锁定一个范围,并且锁定记录本身。
Record Lock总是会去锁住一索引记录
InnoDB对于行的查询都是采用这种锁定算法。
InnoDB存储引擎采用Next-Key Locking机制来避免Phanton Problem(幻想问题)。
InnoBD在REPEATABLE READ隔离级别下,采用Next-Key Locking的方式加锁;
在READ COMMITTED下,其仅采用Record Lock
Gap Lock的作用是为了阻止多个事务将记录插入到同一个范围内,这会导致幻读问题。
在next-key lock算法下,对于索引的扫描,不仅是锁住扫描到的索引,而且还锁住这些索引覆盖的范围(gap)。因此在这个范围内的插入都是不允许的。
只有当查询的索引含有唯一索引时,InnoDB存储引擎会对Next-key Lock进行优化,将其降级到Record Lock,及仅仅锁住索引本身,而不是范围。