02MySQL中InnoDB引擎的行锁模式及其是如何实现的?
行锁模式在存在行锁和表锁的情况下,一个事务想对某个表加X锁时,需要先检查是否有其他事务对这个表加了锁或对这个表的某一行加了锁,对表的每一行都进行检测一次这是非常低效率的,为了解决这种问题,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁,两种意向锁都是表锁。意向共享锁:简称IS锁,一个事务打算给数据行加共享锁前必须先获得该表的IS锁。意向排他锁:简称IX锁,一个事务打算给数据行加排他锁前必须先获得该表的IX锁。有了意向锁,一个事务想对某个表加X锁,只需要检查是否有其他事务对这个表加了X/IX/S/IS锁即可。锁的兼容性如下:行锁实现方式:INnoDB的行锁是通过给索引上的索引项加锁实现的,如果没有索引,InnoDB将通过隐藏的聚簇索引来对记录进行加锁。InnoDB行锁主要分三种情况:Recordlock:对索引项加锁Graplock:对索引之间的“间隙”、第一条记录前的“间隙”或最后一条后的间隙加锁。Next-keylock:前两种放入组合,对记录及前面的间隙加锁。InnoDB行锁的特性:如果不通过索引条件检索数据,那么InnoDB将对表中所有记录加锁,实际产生的效果和表锁是一样的。MVCC不能解决幻读问题,在可重复读隔离级别下,使用MVCC+Next-KeyLocks可以解决幻读问题。
来自:数据库事务和优化-锁相关