Объясните тупик в MySQL - PullRequest
       109

Объясните тупик в MySQL

0 голосов
/ 04 декабря 2018

Я новичок в 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 голосов
/ 25 июня 2019

После прочтения этого примера из MySQL я знаю причину:

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) вОчередь, поэтому стоит подождать Т2.Тупик случается.Даже у T1 есть блокировка записи (id = 1), он не может даже получить эту блокировку пробела, так как T2 ожидает в очереди.

...