锁的种类
- 共享锁
简称S锁,例如:在事物要读取一条记录时,需要先获取该记录的S锁。
select ... lock in share mode;
##给t表添加读锁
LOCK TABLES t READ;
- 独占锁
也称排它锁,简称X锁。例如:在事物要改动一条记录(删除和修改)时,需要先获取该记录的X锁。
select ... for update;
##给t表添加写锁
LOCK TABLES t WRITE;
- 意向共享锁
简称IS锁,当事务准备在记录上加S锁式,需要现在表级别加一个IS锁。意义:快速判断(不用循环遍历)表中是否有记录添加S和X锁, - 意向独占锁
简称IX锁,当事务准备在记录上加X锁式,需要现在表级别加一个IS锁。 - AUTO-INC
用于表中某列使用自增字段,再插入语句是就添加一个表级别的AUTO-INC锁。 - AUTO_INCREMENT
用于自增字段列获取自增数据。 - GAP Lock
间隙锁:也称“gap 锁”,用于防止插入幻影记录。 在事务期间读取(1-10)的记录中加锁(哪怕中间缺失4-5的记录),防止其他事务添加数据(添加了4-5的数据)。
SELECT * FROM t WHERE c1 BETWEEN 1 and 10 FOR UPDATE;
-
Next-Key Lock
在gap锁的范围基础上添加了该条数据的范围 -
Insert Intention Lock
一个事务在插入一条记录时需要判断插入位置是否已被背的事务加了gap锁。 -
隐式锁
MySQL自身在对插入或者修改的数据(没有显示的添加s、x锁)时进行加锁,防止其他事务进行脏读等。实现方式:判断当前记录的trx_id的值是否处于活跃事务阶段。
锁的兼容性
锁类型 | 共享锁 S | 排他锁 X | 意向共享锁 IS | 意向排他锁 IX |
---|---|---|---|---|
共享锁 S | 兼容 | 冲突 | 兼容 | 冲突 |
排他锁 X 冲突 | 冲突 | 冲突 | 冲突 | |
意向共享锁 IS | 兼容 | 冲突 | 兼容 | 兼容 |
意向排他锁 IX | 冲突 | 冲突 | 兼容 | 兼容 |