MySQL: предотвращение состояния гонки - для обновления или блокировки в режиме обмена? - PullRequest
3 голосов
/ 13 мая 2009

Вот мой желаемый порядок транзакций:

  1. User1 выбрать поле, выполнить операцию, обновить с новым значением.
  2. User2 выбрать поле, выполнить операцию, обновить с новым значением.
  3. User3 выбрать поле, выполнить операцию, обновить с новым значением.

Из того, что я понимаю , первый выбор выполняет только блокировку записи, а второй выполняет блокировку чтения и записи.

И то, и другое кажется полезным, но в первом случае, какое значение будет читать User2? Начальное значение до обновления User1 или значение ПОСЛЕ обновления User1 (что я и хочу)?

Так что я запутался, должен ли я использовать SELECT ... ДЛЯ ОБНОВЛЕНИЯ или SELECT ... LOCK IN SHARE MODE?

1 Ответ

6 голосов
/ 14 мая 2009

Вы, вероятно, хотите использовать для обновления.

С «LOCK IN SHARE MODE» второй пользователь все еще сможет прочитать значение до того, как оно будет обновлено.

Из документов MySQL:

Если вы используете FOR UPDATE с хранилищем движок, который использует блокировки страниц или строк, проверенные запросом строки запись заблокирована до конца текущая транзакция. Использование LOCK IN SHARE MODE устанавливает общую блокировку, которая позволяет другим транзакциям читать проверенные строки, но не для обновления или удали их.

Таким образом, хотя LOCK IN SHARE MODE предотвращает обновление, если ваша работа зависит от значения чтения, вы можете оказаться в несогласованном состоянии.

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