#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.
Я бы также более подробно объяснил здесь, что вы пытаетесь сделать.