Невозможно проверить состояние строки (заблокировано или нет) в MySQL - PullRequest
0 голосов
/ 26 января 2011

В моем приложении мне нужно заблокировать некоторые строки, когда они редактируются.Если другой пользователь сделает выбор в этих строках, его запрос должен будет ждать, пока первый пользователь не снимет блокировку.Моя проблема в том, что мне нужно посмотреть, ждет ли запрос, поэтому в этом случае я могу назначить встречу пользователю, который делает запрос.Есть ли у вас предложение по этому сценарию?Заранее спасибо.

1 Ответ

1 голос
/ 26 января 2011

Если вы используете транзакции в MySQL, и если вы используете последнюю версию MySQL (> 5.1), блокировки строк будут установлены, просто делая запросы на выборку в целевых строках внутри транзакции (а неbefore).

Запросы, выполняющиеся параллельно, будут автоматически ждать окончания первой транзакции.Если вы не сделаете очень длинную транзакцию, это ожидание не будет очень долгим, и процесс продолжится сразу после окончания первой транзакции.Если для вашего лечения не требуется более 15 секунд, есть вероятность, что при прерывании транзакции в случае блокировки, отправке ответа вашему конечному пользователю и повторной транзакции позже вы потеряете более длительную петлю.

У MySQL есть тайм-аутустановив блокировку ( тайм-аут ожидания блокировки ), вы можете настроить этот тайм-аут на довольно низкое значение (скажем, 3 с), и вы получите исключение, если время ожидания блокировки слишком велико, тогда вы 'Вам придется прервать вашу транзакцию, но по умолчанию позвольте MySQL выполнить управление блокировкой и ожиданием, не прерывая транзакцию на ранней стадии в случае блокировки.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...