两种引擎关于锁方面的区别:
1、MyISAM默认是表级锁不支持行集锁。
2、InnoDB默认用的是行级锁也支持表级锁。
MyISAM总结:上了共享锁之后依然支持上共享锁,不支持上排他锁。先上排他锁,读或者写都是不允许的,这种特性也同样适用InnoDB引擎。
InnoDB:在sql没有用到索引的时候用的是表级锁,而sql用了索引的时候就会使用行级锁或GAP(普通非唯一索引用到的),
两种引擎的场景:
MyISAM:频繁使用count统计总条数;对数据增删改的频率不高,查询较多的场景;没有事务的系统。
InnoDB:增删改查都非常频繁的表;可考性要求比较高,要求支持事务的系统。
数据库的锁分类:
按照锁的粒度:表级锁,行级锁,页级锁。
按锁级别划分:共享锁、排他锁。
按加锁方式划分:自动锁,显式锁。
按操作划分:DML锁,DDL锁。
按使用方式划分:乐观锁(数据版本实现)、悲观锁(事务实现)。
当前读和快照读:
当前读:select ... lock in share mode,select ... for update,update,delete,insert
快照读:不加锁的select(事务隔离级别为非串行化才成立,否则快照读会退化成当前读)。
InnoDB可重复度隔离级别下如何避免幻读:
表象:快照读(非阻塞读),伪MVCC
内在:next-key锁,行锁+Gap锁
RC和RR级别下的非阻塞读(快照读)如何实现:
数据行里的这些字段控制:DB_TRX_ID,DB_ROLL_PTR,DB_ROW_ID。
undo记录
read view
对主键索引或唯一键索引会用Gap锁吗:
case 1: 如果where条件全部命中,只会加记录锁,不会加Gap锁。
case 2:如果where条件的部分命中命中或全部不命中,则会加Gap锁。
case 3:Gap锁会用在非唯一索引或不走索引的当前读中。