Mysql的InnoDB和MyISAM的锁模块

两种引擎关于锁方面的区别:

  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锁会用在非唯一索引或不走索引的当前读中。

原文地址:https://www.cnblogs.com/niuyg928/p/15150311.html