PHP + MYSQL. Задача с SELECT и UPDATE

R
На сайте с 03.08.2012
Offline
131
694

Есть таблица в бд.

id (int) | user_id (int)

Пользователь запрашивает на выборку 10 строк из таблицы, но, эти данные может получить только он, и не в коем случае, не другой.

Получается:

Делаем сперва SELECT WHERE user_id = 0 LIMIT 5

И далее UPDATE SET user_id="user.id" выбранных записей, чтобы другой пользователь не выбрал одни и те же данные.

Но тут проблема.

Когда идут одновременно 2 и более запросов на выборку,

то разные пользователи получают одни и те же данные из БД, что не допустимо.

Т.е. между запросом SELECT И UPDATE, идет опять запрос к странице от другого пользователя и скрипт опять делает SELECT тех же самых записей...

Помогите, пожалуйста, решить эту проблему.

Как делать выборку и быть уверенным на 100%, что одни и те же данные не попадут разным пользователям?

Mad_Man
На сайте с 10.11.2008
Offline
162
#1

revered, поле user_id вы создали дабы указать кому выбирать данные из таблицы, я правильно понимаю?

R
На сайте с 03.08.2012
Offline
131
#2

Полн user_id показывает кто уже выбрал эти данные. Чтобы не показывать их другому юзеру.

Изначально user_id = 0

MI
На сайте с 16.07.2008
Offline
74
#3

транзакции

Joker-jar
На сайте с 26.08.2010
Offline
167
#4

Делайте сначала update, а потом select.

PN
На сайте с 22.08.2012
Offline
103
#5

Сначала делайте UPDATE , потом считывайте строки пользователя. Если строк не найдено, еще раз UPDATE.

Мой совет помог? Не скупись! Bitcoin 1Lseddet1o1B6odgXQHbGaWGwRkt1Db8Ef Ethereum 0x450f1a17461e25194B7F9226cDEe70173F39e1e1
R
На сайте с 03.08.2012
Offline
131
#6

Спасибо за советы.

Но тут вариант с UPDATE не получился бы.

В итоге сделал с помощью GET_LOCK

Спасибо всем кто откликнулся!

RAS
На сайте с 27.11.2005
Offline
126
RAS
#7

Все верно сделали с LOCK, это самый надежный вариант.

Администрируем сервера, впс, вдс. Ускоряем загрузку сайтов - DLE, Word Press, Joomla, Modx... Настраиваем безопасность. Ручная чистка rootkit/malware/вирусов. (/ru/forum/867860) Разработка - shell/bash/sh/python/perl.
PN
На сайте с 22.08.2012
Offline
103
#8
revered:
Спасибо за советы.
Но тут вариант с UPDATE не получился бы.
В итоге сделал с помощью GET_LOCK

Спасибо всем кто откликнулся!

не получился бы?


do {
query("UPDATE table SET user_id=$user_id WHERE user_id=0 AND read=0 LIMIT 5");
} while (!($rows = get("SELECT * FROM table WHERE user_id=$user_id AND read=0")));
...код...
foreach ($rows as $row)
query("UPDATE table SET read=1 WHERE user_id=$row[user_id]");

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий