#257

Атомарная выборка только одной записи

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