Estou tentando obter uma lista de pg_locks
relevantes para a transação atual
por exemplo
> BEGIN;
BEGIN
> ALTER TABLE ... ;
ALTER TABLE
> select locktype,virtualxid,transactionid,mode,relation from pg_locks;
locktype | virtualxid | transactionid | mode | relation
------------+------------+---------------+---------------------+----------
relation | [NULL] | [NULL] | AccessShareLock | 11695
virtualxid | 2/24699 | [NULL] | ExclusiveLock | [NULL]
relation | [NULL] | [NULL] | AccessExclusiveLock | 801091
(3 rows)
Ok, então o que eu considero como "minha" fechadura aqui é a última, aAccessExclusiveLock
Mas não tem transactionid
ou virtualxid
.
Se houver outra atividade no banco de dados, verei outros bloqueios também nesta lista.
Como faço para filtrar apenas os bloqueios pertencentes à minha transação atual, se eles tiverem IDs de transação nulos?
Eu encontrei uma resposta.
Havia duas partes para isso.
Em primeiro lugar, o que é importante é
virtualtransaction
em vez devirtualxid
. Mesmo sendovirtualxid
nulostransactionid
para tudo o que me interessa, todos eles compartilham umvirtualtransaction
id.Em segundo lugar, embora
txid_current()
retorne atransactionid
, o que parece não ajudar porque todos os meus bloqueios têm null para isso, ainda podemos usá-lo para obter o que queremos.O que acontece é que quando você chama
txid_current()
postgres atribui um lock com otransactionid
retornado por aquela função, que podemos ver se consultarmospg_locks
. Esse bloqueio compartilhará umvirtualtransaction
id com todo o resto da transação atual.Por exemplo:
Então agora a partir disso podemos obter o
virtualtransaction
id compartilhado por tudo na transação atual e filtrar isso.Em outras palavras:
... retornará apenas bloqueios relevantes para a transação atual.
Que tal agora:
Veja se isso ajuda:
Ele exibirá o nome da tabela e onde concedido = false mostra onde o acesso não foi concedido (ou seja, existe um bloqueio).
Além disso, você pode obter seu PID atual no BASH:
$ (echo $$; echo $BASHPID)
obter pid no shell (bash)
Algumas consultas úteis aqui para monitorar bloqueios: Monitoramento de bloqueio