select ... lock in share mode;
##给t表添加读锁
LOCK TABLES t READ;
select ... for update;
##给t表添加写锁
LOCK TABLES t WRITE;
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 | 冲突 | 冲突 | 兼容 | 兼容 |