Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PostgreSQL > Логика работы SELECT FOR UPDATE


Автор: polin11 5.4.2023, 03:05
Использую СУБД PGSQL.

Нужно получить мин. значение CreateDate из таблицы документ
Код

SELECT MIN("CreateDate")
FROM "Document"

если минимальная дата < текущей в цикле вешается транзакция и пересчитывается поле CreateDate, достаю записи
таким запросом: 
Код

SELECT *
FROM "Document"
WHERE "CreateDate" < NOW()::DATE
ORDER BY "CreateDate"
LIMIT 10
FOR UPDATE SKIP LOCKED


Обновление записей
Код

UPDATE "Document"
SET "CreateDate" = ...
...



Насколько понимаю логику работы SELECT FOR UPDATE SKIP LOCKED при паралельных вызовах
будут взяты не заблокированные записи.
Как понимаю проблема будет возникать при получении мин. значение CreateDate,
Код

SELECT MIN("CreateDate")
FROM "Document"

 
заблокированные записи будут пропущены и актуальное значение не получить.
Подскажите пож-ста  можно как-то исправить эту проблему?

Автор: Akina 5.4.2023, 20:12
https://xyproblem.info/ 

Формулируйте задачу, а не свою попытку её решить. Выбранный путь скорее всего ошибочный.

Автор: LSD 5.4.2023, 23:01
SELECT FOR UPDATE блокирует конкретные записи. В приципе нет проблем написать:
Код

SELECT *
FROM "Document"
WHERE "CreateDate" = (SELECT MIN("CreateDate") FROM "Document")
FOR UPDATE

И запрос заблокирует записи где CreateDate минимальная. Но проблема в том, что это не блокирует вставку в таблицу новых значение которые будут меньше минимальной даты. И в целом решение выглядит кривым, стоит описать задачу в целом.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)