以下内容主要参考Mysql官方文档整理
MySQL server的锁主要是全局锁,行锁和表锁,通过存储引擎则可以实现不同的锁机制
MyISAM只支持到表级锁,因为MyISAM的索引与数据是分离的,其索引存储的是数据的物理地址,通过索引无法找到数据,就只能把整个表锁起来
innoDB的锁模型:
行级别的共享(s)与独占锁(x):s锁之间不互斥,s锁与x锁互斥,x锁之间互斥
意向锁:分为意向共享锁(IS)和意向独占锁(IX),表级锁。在事务获取表中的s锁之前需要先获得IS锁或者更强级别的锁;在事务获取表中的x锁之前需要先获得IX锁,参考。表级锁的互斥关系如下:
记录锁:索引记录上的锁,防止对行记录的增删改
间隙锁:在两行索引记录间的锁,或者在第一行记录之前范围的锁,又或者是最后一行记录之后的范围的锁。用于特定隔离级别如RR级别。产生间隙锁的条件:
(1) 使用非唯一索引查询单条记录,锁住前面的间隙
(2) 使用多列唯一索引,锁住中间的间隙
(3) 唯一索引锁住多行记录
更多理解请参考
Next-Key Locks:其实就是记录锁+间隙锁,注意是一个前开后闭的区间。
关于next-key lock的相关规则参考
其他锁比较特殊,不赘述