У меня есть две таблицы table_a
и table_b
. В моем приложении у меня есть бизнес-метод, который выполняет следующие действия:
// it is one transaction
INSERT INTO table_b (join_col) VALUES (some_value);
UPDATE table_a a
JOIN table_b b ON a.join_col = b.join_col AND a.column_a = b.column_b
SET a.column_c = a.column_c + 1;
Я использую движок InnoDB, и проблема в том, что когда я запускаю свой метод параллельно или почти параллельно, я часто получаю следующее сообщение об ошибке:
Обнаружен тупик при попытке получить блокировку; попробуйте перезапустить транзакцию
Похоже, первая транзакция начала обновлять table_a
и поставить блокировку на table_b
, тогда как вторая параллельная транзакция не может быть вставлена в table_b
, потому что она заблокирована.
Если я прокомментирую мой UPDATE
statemenmt, он начнет работать. Обе транзакции вставляются в table_b
без проблем. Итак, как я могу это исправить? Если это имеет значение, я использую MySQL 5.7.