Ситуация:
База данных PostgresSQL.Приложение с SQL Alchemy ORM (не очень важно).Таблица с миллионами строк.
Сотни процессов обращаются к базе данных с этой таблицей.Каждый хочет выбрать одну строку и выполнить относительно дорогую операцию на основе своего содержимого, затем заполнить другие таблицы и обновить эту строку.
Наивный подход, который я использовал, выглядит следующим образом:
SELECT * FROM table WHERE status = 'free';
а затем сразу после этого:
UPDATE table SET status 'in_process';
Теперь проблема заключается в том, что эти операции не являются атомарными, то есть за время между SELECT
и UPDATE
могут выбрать до 5 других процессов.этот ряд и начинайте работать над ним (что, напомню, довольно дорого).
Теперь я знаю, что есть SELECT FOR UPDATE
, который блокирует строки.Но он блокирует их FOR UPDATE
(дух), он не запрещает выделение строк.
Так что я думаю, это должно быть довольно распространенной проблемой, но поиск в Google не сильно помог.