Как избежать одновременного доступа к одной записи?

Здравствуйте.

Имеется таблица с записями, которые будут закреплены за разными пользователями. По умолчанию записи не привязаны ни к одному из пользователей.
Вид таблицы
id | user_id | data
1 | 0 | 123
2 | 0 | 456
3 | 0 | 798


Очередную свободную запись в этой таблице нужно закрепить за пользователем изменив user_id и получить эту измененную запись.
Я вижу алгоритм работы таким: выбираем одну свободную запись и меняем у нее user_id.

Проблема заключается в следующем, возможна ситуация, когда будет несколько одновременных запросов на получение свободной записи. Например, было инициировано два запроса на присвоение свободной записи пользователю посредством запросов на вебсервер. Была выбрана свободная запись, например, с id 1. Второй запрос так же выбрал запись с id 1, так как пока она свободна. Первый запрос присвоил значение user_id нужное ему и второй запрос сделал тоже самое.
В результате запись присвоена пользователю из второго запроса, а пользователь из первого остался ни с чем.

Как разрешается эта ситуация?
  • Вопрос задан
  • 184 просмотра
Решения вопроса 2
xytop
@xytop
PHP/RoR web dev & tech lead
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Поменяйте алгоритм. Сначала назначьте свободную запись пользователю, затем выбирайте её по user_id. Тогда не придется ничего блокировать.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы