@TransparentFox

Как убедится в актуальности строки из базы перед важным UPDATE запросом?

К примеру, есть таблица с полями state и owner_id.
Один обработчик http запроса получает строку из таблицы, проверяет что значение state = "await", и если это так, меняет owner_id.
При этом пользователь может отправить http запрос, обработчик которого изменит state, в том случае если owner_id равен id текущего пользователя.

Но если представить такую ситуацию, что http запросы были отправлены одновременно. Каждый обработчик, получив оригинальную строку из таблицы, убедится, что все условия соблюдены и отправит UPDATE запрос к базе.
Т.е. в итоге получится так, что один из обработчиков получит "устаревшую" (на момент отправки UPDATE запроса) строку из базы, и отправит недопустимый UPDATE запрос, который при проверке актуальной строки отправлен не был бы...

Единственный вариант решения, который я вижу - это добавление условия WHERE в UPDATE запросе каждого обработчика, которое проверяет, что ключевые поля не изменились с момента получения строки. Либо более универсальный способ - условие, которое проверяет, что поле updated_at не изменилось с момента получения строки.

Основные вопросы:
Есть ли другие решения этой проблемы?
Возможно у неё есть название, чтобы можно было её погуглить?)
Возможно я упустил что-то важное?)

update:
Отвечая на свой последний вопрос: да, упустил, я не прочитал о том, как работают блокировки.
https://habrahabr.ru/post/46542/
https://habrahabr.ru/post/238513/
Спасибо за ответы)
  • Вопрос задан
  • 192 просмотра
Решения вопроса 1
sim3x
@sim3x
InnoDB
Транзакции
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Когда делаешь запрос на обновление сразу же меняй статус await, на что нибудь другое типа 'not_await'.
В чем собственно проблема, не могу понять
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы