BEGIN;
LOCK TABLE slots IN ACCESS EXCLUSIVE MODE;
UPDATE slots SET job_name = '111' WHERE id IN (SELECT id FROM slots WHERE job_name IS NULL LIMIT 1) RETURNING *;
COMMIT;
Това изглежда работи в Read Committed. Той е само sql (същия като вашия код) и може да се изпълни с едно извикване (по-бързо).
@Seth Robertson:Не е безопасно без LOCK TABLE и без цикъл while.
Ако има транзакция A и транзакция B едновременно:A ще избере първия ред и B ще избере първия ред. A ще заключи и актуализира реда, B трябва да изчака, докато A се ангажира. Тогава B ще провери отново условието име_задание IS NULL. Невярно е и B няма да актуализира - B няма да избере следващия ред, а само ще провери отново и ще върне празен резултат.
@joegester:SELECT FOR UPDATE не е проблемът, защото цялата таблица е заключена.
Може би има друг начин да свършите работа - ако изтриете и вмъкнете редове (в друга таблица?), Вместо това задайте NULL. Но не съм сигурен как.