выберите для обновления дважды к той же таблице ключом diffrenet, вызывающим взаимоблокировку в MySQL

0
  • Таблица foo имеет идентификатор и имя.
  • Транзакция A выберите для обновления по идентификатору 1.
  • Транзакция B выберите для обновления по идентификатору 1, затем подождите.
  • Транзакция Выберите для обновления по имени что-либо (даже если оно не существует) вызывают блокировку транзакции B.

Почему это происходит?

Ниже сценарии воспроизводят тупик.

create table foo (id int primary key, name varchar(100));
insert into foo values (1, 'foo1');

-- transaction A
start transaction;
select * from foo where id=1 for update;

-- transaction B
start transaction;
select * from foo where id=1 for update;
-- now waiting

-- transaction A
select * from foo where name='xxxxx' for update;
-- transaction B dead lock occer
Теги:
deadlock

1 ответ

0

Я догадался, что ответ на вопрос.

MySQL блокирует все записи при выборе для поиска без индексации столбца.

https://dev.mysql.com/doc/refman/5.7/en/innodb-locks-set.html

Если у вас нет индексов, подходящих для вашего утверждения, и MySQL должен проверять всю таблицу для обработки инструкции, каждая строка таблицы становится заблокированной, что, в свою очередь, блокирует все вставки другими пользователями в таблицу.

Но я не знаю, почему это вызывает тупик.

Кстати, я решил свою проблему, что каждый выбор для обновления для поиска по первичному ключу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню