解释mysql中的死锁

时间:2018-12-04 12:56:17

标签: mysql deadlock database-deadlocks

我是mysql新手。我遇到了僵局。请帮忙解释。

我创建了一个表:

create table test(id INT, value INT, PRIMARY KEY(id));
insert into test(id, value) values(0, 0);
insert into test(id, value) values(1, 1);

在交易1中:

begin;
select * from test where id=1 for update; //it holds record_lock(id=1)

在交易2中:

begin;
select * from test where id=1 for update; //it waits for record_lock(id=1)

然后在事务1中:

select * from test where id>0 for update;

在事务1中的此语句之后,事务2出现错误:

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

这是最新检测到的死锁:

enter image description here

1 个答案:

答案 0 :(得分:0)

从MySQL阅读this示例后,我知道原因:

1)交易01(T1):

begin;
select * from test where id=1 for update; //it holds record_lock(id=1)

执行该语句后,T1保持记录锁定(id = 1)

2)交易02(T2):

begin;
select * from test where id=1 for update; //it waits for record_lock(id=1)

T2进入等待队列,因为它试图获取T1持有的锁。

3)交易01:

select * from test where id>0 for update;`enter code here`

此语句试图获取间隙锁定(从1到无穷大),但是T2正在队列中等待记录锁定(id = 1),因此它应该等待T2。发生死锁。即使T1拥有记录锁定(id = 1),由于T2在队列中等待,它甚至无法获得此间隙锁定。