MySql间隙锁的一个实现

首先创建表demo:

create table demo(
id int,
keyw varchar(20),
PRIMARY KEY (id),
key keyw (keyw)
)

插入数据:

INSERT INTO demo VALUES(1,'d1'),(5,'d1'),(2,'d2'),(6,'d2');

开启两个事务

-------------------------------------------------------------------------------------------------------------

1、START TRANSACTION;

update demo set keyw='d11' where keyw='d1';//1 造成间隙锁(id=1-5的数据被锁)

insert into demo VALUES(3,'d2');//3(执行后开始阻塞,等待线程2释放2-6的间隙锁)

commit;

-----------------------------------------------------------------------------------------------------------------

2、START TRANSACTION;


update demo set keyw='d22' where keyw='d2';//2 造成间隙锁(id=2-6的数据被锁)

insert into demo VALUES(4,'d1');//4执行后造成死锁(id=1-5被事务1锁了), 锁被释放,//3阻塞完毕,此事务回滚

commit;

-----------------------------------------------------------------------------------------------------

注意,此时name是加了索引,不然执行//1会造成表锁,无法完成实验

猜你喜欢

转载自blog.csdn.net/qq_26093341/article/details/80890181