Зачем устанавливать общую блокировку, если во время вставки возникает ошибка с дубликатом ключа

#mysql #innodb

#mysql #innodb

Вопрос:

В качестве блокировок, установленных различными операторами SQL в InnoDB, в разделе INSERT сказано,

ВСТАВКА устанавливает эксклюзивную блокировку для вставленной строки.
Перед вставкой строки устанавливается тип блокировки разрыва, называемый блокировкой разрыва намерения вставки.

Если возникает ошибка дубликата ключа, устанавливается общая блокировка для записи дубликата индекса.

Интересно, зачем устанавливать общую блокировку, как сказано в последующем документе, это может привести к тупиковой ситуации. Почему бы просто не запросить эксклюзивную блокировку?

Это использование общей блокировки может привести к взаимоблокировке, если несколько сеансов пытаются вставить одну и ту же строку, если другой сеанс уже имеет эксклюзивную блокировку.


Приведенный ниже пример скопирован из документа MySQL, который демонстрирует, как вызвать взаимоблокировку.

СОЗДАЙТЕ ТАБЛИЦУ t1 (i INT, PRIMARY KEY (i)) ENGINE = InnoDB;

Теперь предположим, что три сеанса выполняют следующие операции по порядку:

Сессия 1:

 START TRANSACTION;
INSERT INTO t1 VALUES(1);
 

Сессия 2:

 START TRANSACTION;
INSERT INTO t1 VALUES(1);
 

Сессия 3:

 START TRANSACTION;
INSERT INTO t1 VALUES(1);
 

Сессия 1:

 ROLLBACK;
 

Комментарии:

1. Какова цель здесь? Изучение того, как работает движок? Пытаетесь избежать такой блокировки? Что-то еще? Между тем, я предполагаю, что разработчики сделали это по какой-то причине — возможно, какой-то крайний случай, который неочевиден.

2. Просто причина, по которой устанавливается общая блокировка для индексной записи? Мы столкнулись с тупиковой ситуацией, как показано выше. @RickJames