mysql innodb 引擎,锁类型分为:共享锁(S锁)、排它锁(X锁)、意向锁、记录锁(行锁)、间隙锁、临键锁(Next-Key Locks)、自增锁(AUTO-INC Locks)。

其中共享锁、排它锁、记录锁都是行级锁(row-level)。

1、共享锁:允许持有该锁的事务读取一行。 共享的意思是:如果有一个事务持有某一行的S锁,其他的事务也可以获取该S锁。但是不允许其他锁获得该行的X锁。

2、排它锁:允许持有该锁的事务更新和删除行。排它的意思是:如果有一个事务持有某一行的X锁,其他的事务不能获取改行的X锁和S锁,除非等到另外一个事务释放X锁。

3、意向锁:意向锁是表级别的锁,mysql有两种意向锁:意向共享锁(IS) 意向排它锁(IX)。

意向锁遵循两个规则,在事务可以获取表中某行的共享锁之前,它必须首先获取该表中的IS锁或更强的锁;在事务可以获取表中某行的排它锁之前,它必须首先获取该表中的IX锁。

简单描述为:事务获取S锁、X锁前,必须获取IS或者IX锁。

多个事务竞争同一个锁的时候遵循如下规则:

如果一个锁与现有锁兼容,则将其授予请求的事务,但如果与现有锁冲突,则不授予该锁,直到冲突的现有锁被释放。各种锁之间是否冲突参见下表

XIXSIS

X

Conflict

Conflict

Conflict

Conflict

IX

Conflict

Compatible

Conflict

Compatible

S

Conflict

Conflict

Compatible

Compatible

IS

Conflict

Compatible

Compatible

Compatible

4、记录锁(行锁):该锁加在索引所在的记录,但是锁住的是索引列。例如, SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE; 他阻止其他事务inserting, updating, or deleting 在 t.c1 等于 10时,锁住的是c=10这个值。

5、间隙锁:间隙锁是对索引记录之间的间隙的锁定,或者是对第一个或最后一个索引记录之前的间隙的锁定,例如:SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE。防止其他事务将值15插入到t.c1列中,无论该列中是否已有这样的值,因为该范围中所有现有值之间的间隙是锁定的。

间隙锁在RR隔离级别下生效,在RC隔离级别下不生效。

6、临键锁:临键锁是记录锁和间隙锁的组合锁。