目录
1概述
2lock与latch
3InnoDB存储引擎中的锁
3.1锁的类型
3.2一致性非锁定读
3.3一致性锁定读(显式锁)
3.4自增长与锁
3.5外键和锁
4锁的算法
4.1行锁的三种算法
MySQL InnoDB支持三种行锁定方式:
- 行锁(Record Lock):锁直接加在索引记录上面。
- 间隙锁(Gap Lock):锁加在不存在的空闲空间,可以是两个索引记录之间,也可能是第一个索引记录之前或最后一个索引之后的空间。
- Next-Key Lock:行锁与间隙锁组合起来用就叫做Next-Key Lock。
默认情况下,InnoDB工作在可重复读隔离级别下,并且以Next-Key Lock的方式对数据行进行加锁,这样可以有效防止幻读的发生。
Next-Key Lock是行锁与间隙锁的组合,当InnoDB扫描索引记录的时候,会首先对选中的索引记录加上行锁(Record Lock),再对索引记录两边的间隙(向左扫描扫到第一个比给定参数小的值, 向右扫描扫描到第一个比给定参数大的值, 然后以此为界,构建一个区间)加上间隙锁(Gap Lock)。
如果一个间隙被事务T1加了锁,其它事务是不能在这个间隙插入记录的。
4.2解决Phantom Problem
#tx1
begin;
SELECT * from gap_test;#等tx2的DML语句
UPDATE gap_test set tname='c' where id=1;
SELECT * from gap_test;#重执行查询,出现幻行
commit;
#tx2
INSERT INTO gap_test ( id, tname ) VALUES ( 1, 'b' )
6.5锁问题
6.5.3丢失更新
6阻塞
7死锁
7.1概念
8锁升级