@diiimonn

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

Приветствую!
В целом: на сервер приходят клиенты и из определенной таблицы забирают верхнюю строчку согласно временной сортировке, после себя оставляя 1 в поле locked.

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

Я о блокировках только слыхивал, плохо представляю как это работает.
  • Вопрос задан
  • 192 просмотра
Решения вопроса 2
Protossan
@Protossan
студент
По идее вот так должно работать. не зхнаю какой у вас синтаксис используется, поэтому даю только команды:
LOCK TABLES my_table WRITE;
SELECT * FROM my_table;
UNLOCK TABLES;
Ответ написан
dimzon541
@dimzon541
Cудя по описанию вы используете реляционную базу как очередь задач/сообщений, что есть антипаттерн...

По теме - используйте функцию connection_id:
-- Все это надо сделать в транзакции
-- Сначала захватим строчку, пометив ее своим уникальным идентификатором
UPDATE tblName SET locked=connection_id() WHERE locked=0 ORDER BY dateColumn LIMIT 1
-- Получим данные (предварительно захваченную строку)
SELECT * FROM tblName WHERE locked=connection_id()
-- Удалим за собой
DELETE FROM tblName WHERE locked=connection_id()
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Такая же задача была, у меня так работает:
// Заблокировать и читать
    mysqli_query($link," LOCK TABLES `".$source_table."` WRITE ");
    mysqli_query($link," SELECT `data` FROM `".$source_table."`   LIMIT 1 ");

// Удалить только что прочитанное и разблокировать
    mysqli_query($link," DELETE FROM `".$source_table."` WHERE `id`=".$lastid."");
    mysqli_query($link," UNLOCK TABLES ");
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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