Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Определить, что строка заблокирована через select for update / 4 сообщений из 4, страница 1 из 1
28.08.2018, 15:25
    #39694394
Antipich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить, что строка заблокирована через select for update
Добрый день.
У мен есть несколько процессов, работающие с одной таблицей.
Один процесс делает select for update limit skip locked

В другом процессе мне нужно запросить все записи из этой таблицы с флагом, какие записи сейчас заблокированы.

Пока все, что придумал, это делать
Код: plsql
1.
2.
3.
4.
5.
select t1.id, t2.id is null as locked 
from t as t1
left join (
   select id from t for update skip locked
) t2 on t1.id = t2.id



Соответственно, если какая-то строка заблокирована, ее не вернет подзапрос из t2 и мы можем это легко понять.
Данный запрос выполняется в атомарной транзакции и занимает очень мало времени.

Проблема в том, что пока этот запрос в процессе выполнения, как я понимаю, она блокирует строки. И если первый процесс именно в этот момент попробует получить новую пачку строк для обработки, он ничего не получит.
Конечно, вероятность того, что эти два процесса так точно наложатся во времени, не высока, но само наличие такой ненулевой вероятности меня напрягает.

Как можно понять, что строка заблокирована, не прибегая к, хоть и очень краткосрочной, но блокировке всех остальных строк?

Спасибо!
...
Рейтинг: 0 / 0
28.08.2018, 16:50
    #39694486
Alexius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить, что строка заблокирована через select for update
Antipich,

как вариант - взять из pg_stat_activity те процессы, которые потенциально могут блокировать строки в этой таблице (если это можно как-то выделить), взять их backend_xid'ы и искать строки в таблице с таким xmax. но не уверен что это хорошая идея.
...
Рейтинг: 0 / 0
28.08.2018, 16:59
    #39694488
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить, что строка заблокирована через select for update
Alexius,

уж скорее pg_locks читать
...
Рейтинг: 0 / 0
29.08.2018, 10:21
    #39694741
big-trot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить, что строка заблокирована через select for update
Вы говорите
AntipichИ если первый процесс именно в этот момент попробует получить новую пачку строк для обработки, он ничего не получит.
Конечно, вероятность того, что эти два процесса так точно наложатся во времени, не высока, но само наличие такой ненулевой вероятности меня напрягает.

А вас не напрягает, что AntipichВ другом процессе мне нужно запросить все записи из этой таблицы с флагом, какие записи сейчас заблокированы.
Полученные данные имеют не нулевую вероятность своей достоверности.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Определить, что строка заблокирована через select for update / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]