MySQL JDBC: есть ли возможность автоматической повторной попытки после тупика InnoDB? - PullRequest
9 голосов
/ 09 августа 2011

Я Обход ошибки вокруг MySQL «Обнаружен тупик при попытке получить блокировку; попробуйте перезапустить транзакцию »

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

Замки не опасны. Просто попробуйте еще раз.
http://dev.mysql.com/doc/refman/5.0/en/innodb-deadlocks.html

Был один оператор "super insert..select", который вставлялся в таблицу узких мест после выбора объединенной комбинации двух других таблиц и использования условий под-операторов в таблице узких мест, а также в нескольких крошечных таблицах.

Горловина бутылки "ждала блокировки", без сомнения, она ожидала блокировки записи. InnoDB, казалось, идеально подходит. (для таблицы с интенсивной записью) И все сомнения относительно этого одного утверждения теперь ушли.

Но теперь возникает проблема: на каждые 100 выполнений оператора примерно 1 или 2 из них завершатся неудачно из-за тупика. Я считаю, что тупик возникает только между экземплярами "super insert..select". Я установлю автоматическое повторение этого утверждения, но мне было интересно

Вопрос: Есть ли в MySQL JDBC возможность включить автоповтор операторов после получения исключения, или мне нужно написать собственный код для этого?

com.mysql.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction

В этом случае у меня нет команд запуска транзакции или остановки транзакции. Только одно утверждение "super insert..select"

1 Ответ

5 голосов
/ 09 августа 2011

Вы можете повторить утверждение, но в идеальном мире вам следует откатить транзакцию и начать ее заново.И ваши транзакции будут короткими в этом мире:)

...