Задать вопрос
@shell_execute

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

Добрый день! Предположим у нас есть таблица в БД с таким устройством:
int id
int user_id DEFAULT NULL

И у нас есть сервер на PHP который принимает ID записей из таблицы выше и записывает в user_id ID первого пользователя, что прислал запрос, например:
SELECT user_id FROM table WHERE id = ID что нам пришел от клиента
Если user_id == NULL
UPDATE table SET user_id = ID юзера что прислал запрос WHERE id = ID что нам пришел от клиента

Так как сервер естественно многопоточный, то появляется вероятность того, что 2 запроса от двух разных клиентов могут придти с одним и тем же ID практически в одно и тоже время. И для обоих проверка user_id == NULL будет истинной, и следовательно будет выполнено 2 UPDATE.
Собственно интересует, как можно избежать подобной прискорбной ситуации?
Есть идеи использовать row-level locking на ID что приходит от клиента сразу как только приходит запрос, но не ясно как это правильно реализовать.
  • Вопрос задан
  • 245 просмотров
Подписаться 1 Оценить 2 комментария
Решения вопроса 2
@shell_execute Автор вопроса
Sergey "А почему бы в UPDATE не добавить условие user_id is NULL?"
Вот он гениальный и правильный ответ :)
Ответ написан
Комментировать
@fynivx
Software Engineer ( .NET )
Для таких случаев (обновить список рекордов в зависимости от результатов другой выборки) есть транзакции и SELECT FOR UPDATE (легко гуглится).

Только я не могу понять, зачем в этом конкретном случае это вообще надо и почему нельзя это сделать одним запросом )

"UPDATE table SET user_id = ID_user WHERE id = ID_client AND user_id = NULL"

Вот так например.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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