stalxed
Новичок
Есть следующий упрощенный запрос(удалил лишнее):
Конструкция
INSERT INTO latest_action (created_date, orderId) VALUES (?, ?)
используется лишь в 1 участке кода.
И вот по записанным трейсам я вижу, что в этом участке периодически происходят deadlockи.
Дальше стал смотреть MySQL логи.
SHOW ENGINE INNODB STATUS показывает следующие два запроса:
INSERT INTO latest_action (created_date, orderId) VALUES ('2015-11-22 17:33:13', '1642')
INSERT INTO latest_action (created_date, orderId) VALUES ('2015-11-22 17:33:13', '1641')
Правильно ли я понимаю, что поймал GAP блокировку? Или id близко друг с другом - это просто совпадение?
Как бороться с такой блокировкой? Повторить транзакцию? И что это за глупость такая, взаимной блокировки здесь нет, я весь код прочесал, это лишняя "умная" перестраховка MySQL?
Код:
START TRANSACTION
SELECT ol.created_date, ol.orderId
FROM latest_action ol
WHERE ol.orderId = ?
FOR UPDATE
// много не блокирующих селектов
INSERT INTO latest_action (created_date, orderId) VALUES (?, ?)
COMMIT
INSERT INTO latest_action (created_date, orderId) VALUES (?, ?)
используется лишь в 1 участке кода.
И вот по записанным трейсам я вижу, что в этом участке периодически происходят deadlockи.
Дальше стал смотреть MySQL логи.
SHOW ENGINE INNODB STATUS показывает следующие два запроса:
INSERT INTO latest_action (created_date, orderId) VALUES ('2015-11-22 17:33:13', '1642')
INSERT INTO latest_action (created_date, orderId) VALUES ('2015-11-22 17:33:13', '1641')
Правильно ли я понимаю, что поймал GAP блокировку? Или id близко друг с другом - это просто совпадение?
Как бороться с такой блокировкой? Повторить транзакцию? И что это за глупость такая, взаимной блокировки здесь нет, я весь код прочесал, это лишняя "умная" перестраховка MySQL?