MySQL锁

本文介绍MySQL InnoDB下锁的实现以及优化。

【未完待续】

InnoDB在RR级别下,通过Next Key Lock(Record Lock+Gap Lock)提供了等价于Serializable的能力。Serializable被用在分布式事务上,即对于分布式事务,MySQL要求Serializable隔离级别

实验

实验修改自文章

1
2
3
4
5
6
7
drop table table1;
create table table1(
c1 int,
key index_c1(c1)
);

insert into table1 values (1),(3),(5),(8),(11);

Session1,使用for update会强制加行锁(如果存在)或者间隙锁

1
2
start transaction;
select * from table1 where c1 = 8 for update;

Session2

1
2
3
start transaction;
select * from table1;
insert into table1 values (6);

Session2会被Session1阻塞。如果没有间隙锁,那么只会锁住c1为8的这一行。

Reference