К примеру, есть таблица с полями 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/
Спасибо за ответы)