解释 mysql 中的死锁
Explain deadlock in mysql
我是 mysql 的新手。我遇到了僵局。请帮忙解释一下。
我创建了一个table:
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
这是最近检测到的死锁:
阅读 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 正在队列中等待 record-lock(id=1),因此它应该等待 T2。死锁发生。即使 T1 有 record-lock(id=1),它甚至无法获得这个间隙锁,因为 T2 在队列中等待。
我是 mysql 的新手。我遇到了僵局。请帮忙解释一下。
我创建了一个table:
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
这是最近检测到的死锁:
阅读 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 正在队列中等待 record-lock(id=1),因此它应该等待 T2。死锁发生。即使 T1 有 record-lock(id=1),它甚至无法获得这个间隙锁,因为 T2 在队列中等待。