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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top