19.Mysql之innodb锁浅谈02

1.前言:

  01小结主要介绍了数据库锁的作用,主要介绍了两种锁:latch和lock锁,前者是一种轻量级的锁(线程锁,存在数据结构中),后者是事务锁,也是innodb存储引擎中最重要的锁。

2.innodb存储引擎中的锁

   innodb存储引擎锁按照颗粒度进行划分,可以分为表锁和行锁,

   其中行锁有有以下几种:

  • 共享锁与排他锁(Shard and Exclusive Lock)
  • 记录锁(Record Lock)
  • 间隙锁(GAP Lock)
  • 记录锁与间隙锁的组合(Next-Key Lock)
  • 插入意向锁(insert intention Lock)

  表锁有以下几种:

  • 意向锁(intention Lock)
  • 自增锁(auto-inc Lock)

3.行锁

  3.1.共享锁与排他锁 

  • 当读取一行记录时,为了防止别人修改,则需要添加S锁
  • 当修改一行记录时,为了防止别人同时进行修改,则需要添加X锁

这里需要知道Mysql基于MVCC特性,所以在通常情况下,普通的查询数据非锁定读,不会添加任何锁(即一致性非锁定读,快照读?)。还有一种是锁定读(当前读),例如

  • select ... for share (Mysql 8.0中新增的方式),在以前版本中select ... lock in share mode,添加S锁,其他事务其实可以读取,但是不能修改,修改的话会阻塞
  • select ... for update ,添加X锁,其他事务修改或者执行select ... for share 都会被阻塞  

  小结:执行普通的select....from语句中是不会加任何锁的,但是如果执行特殊的select ....from lock in share mode语句时,这时会加上共享锁(share Lock),当然此时也会是当前读而不是一致性非锁定读(快照读)了。 在Repeatable-read隔离级别下,innodb存储引擎select操作(普通的select)使用的是一致性非锁定读。      

  3.2 记录锁 

  • 在Mysql中记录锁都是添加在索引上的,即使表中没有索引,也会在默认创建的聚集索引上添加记录锁。

   3.3 间隙锁

  • 间隙锁的锁定范围是索引记录之间的间隙,或者第一条或者最后一条索引记录之前的间隙,间隙锁是针对事务隔离级别为可重复读或以上级别的

   3.4 记录锁与间隙锁的组合

  • Next-key lock 是记录锁与间隙锁的组合,也就是索引记录本身加上之前的间隙,间隙锁保证在repeatable-read 级别下不会出现幻读现象,防止在同一个事务内得到的结果不一致,     

   3.5 插入意向锁

  • 插入意向锁是针对insert 操作设置的一种特殊的间隙锁,主要是为了优化insert 操作的并发能力,这个锁表示插入的意图,即插入具有相同索引间隙的多个事务,如果插入的值不同,则不需要等待。
  • 假设存在4和7的索引记录,现在分别尝试插入值为5和6的事务,在获取插入行的排他锁之前,会添加插入意向锁锁定4和7之间的间隙,但是不会互相阻塞,因为插入的行是不冲突的
  • 这里需要注意的是,插入意向锁之间是不冲突的,但是插入意向锁可能和其他锁是冲突的,比如Next-key Lock 

4.表锁

  4.1 意向锁

   意向锁在Mysql中是表级别的锁,表示将来要对表添加什么类型锁(IX/IS)

  • select ... for share ,添加意向共享锁(IS)
  • select ... for update,添加意向排他锁(IX)

  在获取表中某行的共享锁之前,首先必须获取表中的IS锁,在获取表中某行的独占锁之前,首先必须获取表的IX锁,

  意向锁不会阻止除表锁请求(例如,执行lock table ... write 语句)之外的锁,可以这样理解:在申请表锁(执行lock table语句)时表记录不能存在锁,在没有意向锁的情况下,就需要扫描表中的每一条记录,查看记录上是否存在锁,但是有了意向锁之后,只要判断表上是否存在意向锁即可,如果有意向锁存在,则说明表中某行记录已被锁定或这将要被锁定,表锁的申请语句(LOck  table )会等待,意向锁设计提高了效率。

  4.2 自增锁

  自增锁是插入到具有auto_increment字段的表中的事务所采用的特殊表级锁,在最简单的情况下,如果一个事务正在向表中插入值,则其他任何事务都必须等待插入语句执行完成,这样才能保证后面事务插入的主键值是连续的。

  innodb_autoinc_lock_mode参数用于控制自增锁的算法,通过控制自增值生成的策略来提高并发能力。

      

  

   

  

原文地址:https://www.cnblogs.com/zmc60/p/15004552.html