1、行锁:
我们知道myisam默认是表锁,锁的粒度较大,因此适用读多写少的场景。在innodb中默认是行锁,每次增删改一行数据,会将该行锁住。后续的线程操作改行数据会被阻塞,直到持有行锁的线程释放锁。
2、间隙锁:
间隙锁的出现是为了在innodb的可重复读隔离级别下,解决幻读问题产生的。间隙锁会封锁该条记录相邻两个键之间的空白区域,防止其它事务在这个区域内插入、修改、删除数据;所谓间隙是将数据分为不同区间,对该区间范围进行加锁,区间的规则为左开右闭,比如当数据为1,3,5时,对应的区间为(-∞,1],(1,3],(3,5],(5,+∞];
对于操作的数据是主键索引和普通索引,有不同的加锁规则,如下:
1)、唯一索引只有锁住多条记录或者一条不存在的记录的时候,才会产生间隙锁,指定给某条存在的记录加锁的时候,只会加记录锁,不会产生间隙锁;
2)、普通索引不管是锁住单条,还是多条记录,都会产生间隙锁;
3、next-key lock
行锁+间隙锁就组成了next—key lock,innodb在可重复度隔离级别下,采用next-key lock来防止幻读,因此实现了最高的隔离级别。
参考:
mysql的锁机制 - 记录锁、间隙锁、临键锁 - 咖啡屋小罗的文章 - 知乎
另外:关于我的个人博客网站.,欢迎访问