Como verificar a operações pendentes em uma transação PostgreSQL
-
22-07-2019 - |
Pergunta
Eu tenho uma sessão (SQLAlchemy) no PostgreSQL, com uma transação não confirmada ativo. Eu só passou a sessão para alguma árvore chamada que pode ou não ter emitido SQL INSERT
/ UPDATE
/ DELETE
declarações, através sqlalchemy.orm
ou diretamente através da conexão subjacente.
Existe uma maneira de verificar se existem quaisquer dados que modificam pendentes declarações nesta transação? Ou seja, se comprometer seria um não-op ou não, e se rollback iria descartar alguma coisa ou não?
Eu vi pessoas apontam v$transaction
no Oracle para a mesma coisa (veja este SO pergunta ). Eu estou procurando algo semelhante para usar em PostgreSQL.
Solução
Comece por verificar em vista sistema pg_locks.
http://www.postgresql.org/docs/ 8.4 / interativo / view-pg-locks.html
Outras dicas
Considere a seguinte sequência de comandos:
select txid_current();
begin;
select txid_current();
Se o ID de transação retornou pelos dois seleciona é igual, então não é uma transação aberta. Se não, então não havia, (mas agora é).
Se os números são diferentes, em seguida, como um efeito colateral você só vai ter aberto uma transação, que você provavelmente vai querer perto.
Atualizar : Na verdade, como @ r2evans pontos fora, você não precisa do "começar" - txid_current () irá retornar o mesmo número apenas se você (graças para o insight!) estão em uma transação.
Não, não a partir do nível de banco de dados, na verdade. Talvez você pode adicionar um pouco de rastreamento no nível sqlalchemy para segui-lo?
Além disso, como você define um não-op? E se você atualizou um valor para o mesmo valor que tinha antes, é que um não-op ou não? Do ponto de vista bases de dados, se tivesse um, não seria um não-op. Mas a partir da perspectiva do aplicativo, ele provavelmente faria.