2013-07-18 3 views
0

Я пишу библиотеку инфраструктуры для наших серверов mysql. Одним из сценариев, которые мне приходится обрабатывать, является временное отключение от сервера mysql.Стратегия управления для (ER_QUERY_INTERRUPTED) на mysql

Сценарий тестирования начинается с 100000 вставок в БД, а затем останавливает db и возвращает его обратно.

Во время этого сценария я уверенно получаю ошибку ER_QUERY_INTERRUPTED в запросах, запущенных во время остановки. Возникает вопрос:

Могу ли я считать, что-то о состоянии БД (как запрос не запущен) или рассматривают это как неопределенному behaiviour и упасть эту проблему вниз по цепочке к пользователю?

+0

Пока вы делаете все это внутри транзакции, вы можете спокойно повторить запрос. Отключение во время транзакции приведет к автоматическому откату на SQL-сервере. Если вы находитесь за пределами транзакции, запрос _may has_ ​​совершил, или _may not have_. Вставка снова может привести к дублированию данных. –

+0

@ColinMorelli: Если вы используете механизм транзакционного хранилища, такой как 'InnoDB', тогда все операции« внутри транзакции »(хотя они могут автокомментировать). – eggyal

+0

@eggyal Что я имел в виду, это неавтоматическая транзакция. Если вы не _explicitly_ отправляете 'COMMIT', вы не можете быть уверены, был ли запрос выполнен или нет во время отключения. –

ответ

0

После некоторых испытаний появились следующие сообщения. Мы (и большинство людей) используем InnoDB, чей режим по умолчанию - транзакция. Из-за этого Если ER_QUERY_INTERRUPTED отправляется клиенту, запрос на сервере откатывается назад. В связи с этим стратегия обработки ошибок в этом случае будет просто повторить все запросы с такой ошибкой.