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:代表插入意向锁。