PHP-скрипт прерывается, вызывает сбой транзакции MySQL, все приложение на некоторое время блокируется - PullRequest
1 голос
/ 22 июня 2010

Я использую транзакции в базе данных MySQL вместе с Ajax, и у меня возникают некоторые проблемы с тайм-аутами сценариев. Итак, вот краткое изложение того, что происходит:

  1. Ajax-скрипт на странице делает запрос к серверу.
  2. Сервер получает запрос; скрипт запускает транзакцию MySQL.
  3. Сценарий Ajax настроен на тайм-аут через две секунды; время вышло; говорит серверу прервать запрос.
  4. Серверный скрипт умирает; транзакция оставлена ​​без ответа.
  5. MySQL замечает, что транзакция была приостановлена; откатывается, как и должно быть, но не раньше, чем кучка клиентов станет недовольна, потому что столы были заблокированы на полминуты, и они не смогли получить доступ к сайту.

Что делать?

Я предполагаю, что серверному сценарию нужно чуть больше времени, чем две секунды, которые он дает, поэтому я вызывал ignore_user_abort() на каждой странице, а затем вызывал register_shutdown_function(), чтобы явно откатить транзакцию, если клиент фактически прервал .

Это хороший план? Есть ли альтернатива?

Ответы [ 2 ]

0 голосов
/ 22 июня 2010

Используете ли вы постоянные подключения к базе данных, то есть: используете mysql_pconnect()?Они будут поддерживать соединение внутри веб-сервера, даже если PHP-скрипт не запущен.Таким образом, любые транзакции / блокировки, полученные во время выполнения сценария, останутся активными в этом постоянном соединении, когда сценарий будет аварийно завершен.

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

0 голосов
/ 22 июня 2010

register_shutdown_function () сама по себе будет даже хорошим решением. Попробуйте удалить ignore_user_abort (), чтобы скрипт знал, когда (или если) пользователь прерывает загрузку.

Я бы также, вероятно, разрешил сценарию более 2 секунд, посмотрим, поможет ли это.

...