Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Логика работы SELECT FOR UPDATE 
:(
    Опции темы
polin11
Дата 5.4.2023, 03:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 6.6.2015

Репутация: нет
Всего: нет



Использую СУБД 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"

 
заблокированные записи будут пропущены и актуальное значение не получить.
Подскажите пож-ста  можно как-то исправить эту проблему?
PM MAIL   Вверх
Akina
Дата 5.4.2023, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 3
Всего: 453



https://xyproblem.info/ 

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
LSD
Дата 5.4.2023, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15709
Регистрация: 24.3.2004

Репутация: 3
Всего: 537



SELECT FOR UPDATE блокирует конкретные записи. В приципе нет проблем написать:
Код

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

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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PostgreSQL | Следующая тема »


 




[ Время генерации скрипта: 0.1184 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.