Estou usando o Postgresql 11.
Encontrei um erro semelhante ao seguinte em meus logs:
org.postgresql.util.PSQLException: ERROR: deadlock detected
Detail: Process 332091 waits for ShareLock on transaction 99896257; blocked by process 332093.
Process 332093 waits for ShareLock on transaction 99923910; blocked by process 332091.
Hint: See server log for query details.
Where: while locking tuple (884208,33) in relation "tab_1"
SQL statement "SELECT 1 FROM ONLY "sch"."tab_1" x WHERE "tab_1_key" OPERATOR(pg_catalog.=) $1 FOR KEY SHARE OF x"
SQL statement "INSERT INTO sch.tab_2 (col1, col2, ..., coln)
SELECT
col1,
col2,
...
coln
FROM
sch.tab_3
LEFT JOIN sch.tab_4
ON tab_4.id = tab_3.id
LEFT JOIN sch.tab_5
ON tab_5.id = tab_3.id
Então, basicamente, a primeira consulta se parece com alguma consulta interna do banco de dados, nada do meu código.
E parece que está causando um impasse com minha consulta. Mas eles não estão relacionados por nenhuma tabela.
Alguma idéia sobre como rastrear o motivo do impasse nesse caso?
Essas consultas são geradas internamente pelos gatilhos que implementam restrições de chave estrangeira.
Por exemplo, adicionar uma linha a uma tabela com uma restrição de chave estrangeira adicionará esse bloqueio de compartilhamento de chave na linha correspondente na tabela referenciada, para que ninguém possa excluí-la ou modificar a chave primária até que a transação de inserção seja concluída.
Isso pode causar impasses entre transações que modificam ambas as tabelas.
Ao procurar as instruções com falha, não esqueça que não foi necessariamente a última instrução na transação (que é mostrada na mensagem de log) que recebeu o bloqueio problemático.
Uma maneira de proceder é definir
log_min_duration_statement
como 0 e, quando o deadlock ocorrer novamente, examine todas as instruções executadas pelas transações afetadas. A outra maneira é revisar o código do aplicativo para descobrir quais instruções foram executadas nas transações.