= 11674).
Запрос зависает.
Делаю запрос в pg_locks по pid = 11674:
полуаю, что granted = false на таблице 23759 (это и есть таблица accounts) в режиме AccessShareLock.
Смотрю, кто заблокировал таблицу:
select * from pg_locks where relation = 23759;
Вижу запрос с pid = 27707, который получил право (granted = true) в режиме AccessShareLock.
Так же нашёл процесс 3762, который хочет получить блокироку AccessExclusiveLock, но у него пока что granted = false.
Вопрос:
почему AccessShareLock конфликтует с AccessShareLock?
Выяснил, что процесс с pid = 27707 делает нечто вроде таого:
loop
if pg_try_advisory_lock(....)
then
insert into accounts_balances
select
from accounts
join ...
;
exit;
end if;
end loop;
и потребляет 100% CPU.
При это судя по pg_locks этот процесс зашёл в if, так как получил блокировку на accounts, accounts_balances (всякие индексы соотвествующие) и advisory lock.
Вообщем у меня "пазл"" не собирается.
Есть идеи куда ещё глянуть?
"Простой запрос" делается с каким уровнем изоляции?
Потому что lock queue, наверное (об этом часто забывают). Т.е. в очереди 3762 (AccessExclusiveLock) стоит перед 11674 (AccessShareLock).
Обсуждают сегодня