mysql вставить в тупик, связанный с дубликатом ключа

#mysql

#mysql

Вопрос:

В журналах у меня есть взаимоблокировки, связанные с этим запросом:

 INSERT INTO `driver_state` (id, state)
  VALUES('83799','waiting')
ON DUPLICATE KEY UPDATE    
  state = IF(state = 'active', state, VALUES(state));
  

Точная ошибка:

 ER_LOCK_DEADLOCK: Deadlock found when trying to get lock; try restarting transaction 
  

Я пытался рассуждать и понимать, как этот запрос может даже вызвать тупик, но не продвинулся очень далеко.

Структура таблицы

  CREATE TABLE IF NOT EXISTS `driver_state` (
   `id` int(11) NOT NULL,
   `state` enum('inactive','waiting_orders','has_order','busy') DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8;
  

В этом случае мы используем таблицу ПАМЯТИ, но с InnoDB у нее те же проблемы с блокировкой.

Таблица получает множество таких вставок при дублировании ключевых запросов и запросов выбора (все запросы выбора очень быстрые и оптимизированные). Транзакции нигде не используются, ни ручная блокировка и т. Д.

Не могли бы вы предложить какие-либо идеи, что может вызвать это?

Ответ №1:

Почему в вашем ОБНОВЛЕНИИ С ДУБЛИКАТОМ КЛЮЧА есть оператор IF?

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

Что не так с состоянием ОБНОВЛЕНИЯ ДУБЛИКАТА КЛЮЧА =’ожидание’?

Я бы попробовал это, чтобы увидеть, исчезнет ли взаимоблокировка, чтобы подтвердить, что она вызвана IF.

Я бы также более подробно объяснил здесь, что вы пытаетесь сделать.