Представь простую очередь задач в SQL. У каждой есть уникальный ID, поле статуса (новая, в работе, закончена) и данные. Представь себе, что очередь у тебя разбирают несколько серверов.
Как сделать так, чтобы одну задачу забирал только один сервер?
На помощь приходит SELECT ... FOR UPDATE
:
BEGIN;
SELECT * FROM Queue
WHERE status = 'new'
LIMIT 1
FOR UPDATE;
UPDATE Queue
SET status = 'in progress'
WHERE id = xxx;
COMMIT;
Как только SQL сервер получает запрос на выборку FOR UPDATE
, он никому другому больше не отдаст эту запись, пока ты не закроешь транзакцию.
Кстати, организовывать очередь на SQL нужно аккуратно. Природа ее нагрузки такова, что очередь — небольшая, а SQL — уже задыхается. Не для очередей его взращивали.