= 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).
Обсуждают сегодня