首先创建表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会造成表锁,无法完成实验