InnoDB的行锁是实现在索引上的,而不是锁在物理行记录上。潜台词是,如果访问没有命中索引,也无法使用行锁,将要退化为表锁。
- 记录锁(Record Locks):锁定索引记录;
- 间隙锁(Gap Locks):锁定间隔,防止间隔中被其他事务插入;
- 临键锁(Next-Key Locks):锁定索引记录+间隔,防止幻读;
如果数据库的事务隔离级别将为RC(读提交),那么间隙锁和临键锁都会失效。
最后总结一下MyISAM和Innodb的区别:
- MyISAM只支持表锁,InnoDB可以支持行锁。
- MyISAM不支持外键,InnoDB支持外键。
- MyISAM不支持事务,InnoDB支持事务。
- count(*) MyISAM会直接存储总行数,InnoDB则不会,需要按行扫描。
- InnoDB的索引与行记录存储在一起,这一点和MyISAM不一样
2019-07-30
关于MySQL的锁这块,总是感觉含混不清,各种概念混在在一起。
一个清晰的分类是:记录锁,间隙锁,临键锁,表锁。其中记录锁分成共享锁(S)和排斥锁(X)。
间隙锁和临键锁 在RC级别中,是要失效的。
一个有深度的知识是,记录锁的实现是基于索引的,想要使用记录锁,必须命中索引,否则只能退化为表锁。
2020-02-28
间隙锁和临键锁,只存在RR
MVCC只存在RC和RR
网友评论