InnoDB锁介绍.md

InnoDB锁可以划分为行锁和表锁

官方文档:https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html

行锁有以下的几种:

  • 共享锁与排他锁(Shared and Exclusive Lock)
  • 记录锁(Record Lock)
  • 间隙锁(Gap Lock)
  • 记录锁与间隙锁的组合(Next-Key Lock)
  • 插入意向锁(Insert Intention Lock)

表锁有以下几种:

  • 意向锁(Intention Lock)
  • 自增锁(AUTO-INC Lock)

行锁

1.共享锁【S】和排它锁【X】

  • 普通查询不会添加任何锁
  • 当读取一行记录时,为了防止别人修改,则需要添加S锁。
  • 当修改记录时,为了防止别人同时进行修改,则需要添加X锁。
# 手动添加S锁
SELECT ... LOCK IN SHARE MODE   # 8.0前
SELECT… FOR SHARE # 8.0
# 手动添加X锁
SELECT… FOR UPDATE

2.记录锁(Record Lock)

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

3.间隙锁(Gap Lock)

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

4.记录锁与间隙锁的组合【Next-Key Lock】

Next-Key Lock 是索引记录本身加上之前的间隙。间隙锁保证在REPEATABLE-READ级别下不会出现幻读现象,防止在同一个事务内得到的结果不一致。

5.插入意向锁(Insert Intention Lock)

插入意向锁是针对INSERT操作设置的一种特殊的间隙锁,主要是为了优化INSERT操作的并发能力。这个锁表示插入的意图,即插入具有相同索引间隙的多个事务,如果插入的值不同,则不需要互相等待。插入意向锁之间是不冲突的,但是插入意向锁可能和其他锁是冲突的,比如Next-Key Lock。

表锁

1.意向锁(Intention Lock)

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

  • SELECT… FOR SHARE,添加意向共享锁(IS)
  • SELECT … FOR UPDATE,添加意向排他锁(IX)
    在获取表中某行的共享锁之前,首先必须获取表的IS锁。在获取表中某行的独占锁之前,首先必须获取表的IX锁。

2.自增锁(AUTO-INC Lock)

自增锁是插入到具有AUTO_INCREMENT字段的表中的事务所采用的特殊表级锁。innodb_autoinc_lock_mode参数用于控制自增锁的算法。

锁含义

使用show engine innodb语句查看锁信息时,会看到LOCK_MODE字段

  • IX:代表意向排他锁。
  • X:代表Next-Key Lock锁定记录本身和记录之前的间隙(X)。
  • S:代表Next-Key Lock锁定记录本身和记录之前的间隙(S)。
  • X, REC_NOT_GAP:代表只锁定记录本身(X)。
  • S, REC_NOT_GAP:代表只锁定记录本身(S)。
  • X, GAP:代表间隙锁,不锁定记录本身(X)。
  • S, GAP:代表间隙锁,不锁定记录本身(S)。
  • X, GAP,INSERT_INTENTION:代表插入意向锁。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容