Представь простую очередь задач в 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 — уже задыхается. Не для очередей его взращивали.