Domanda

Ho una sessione (SQLAlchemy) su PostgreSQL, con una transazione attiva non impegnata. Ho appena passato la sessione ad un albero delle chiamate che può o meno aver emesso le istruzioni SQL INSERT / UPDATE / DELETE , tramite sqlalchemy.orm o direttamente attraverso la connessione sottostante.

Esiste un modo per verificare se ci sono dichiarazioni di modifica dei dati in sospeso in questa transazione? Cioè se il commit sarebbe una no-op oppure no, e se il rollback scarterebbe qualcosa o no?

Ho visto la gente sottolineare v $ transazione in Oracle per la stessa cosa (vedi questa domanda SO ). Sto cercando qualcosa di simile da usare su PostgreSQL.

È stato utile?

Soluzione

Inizia controllando nella vista di sistema pg_locks.

http://www.postgresql.org/docs/ 8.4 / interattivo / vista-pg-locks.html

Altri suggerimenti

Considera la seguente sequenza di istruzioni:

select txid_current();

begin;

select txid_current();

Se l'ID della transazione restituito dalle due selezioni è uguale, allora c'è una transazione aperta. In caso contrario, non c'era (ma ora lo è).

Se i numeri sono diversi, come effetto collaterale avrai appena aperto una transazione, che probabilmente vorrai chiudere.

AGGIORNAMENTO : In effetti, come sottolinea @ r2evans (grazie per la comprensione!), non è necessario il "inizio" " - txid_current () restituirà lo stesso numero solo se si è in una transazione.

No, non dal livello del database, davvero. Forse puoi aggiungere qualche traccia a livello di sqlalchemy per rintracciarla?

Inoltre, come si definisce un no-op? Che cosa succede se si aggiorna un valore con lo stesso valore che aveva prima, è no-op o no? Dal punto di vista dei database, se ne avesse uno, non sarebbe una no-op. Ma dal punto di vista dell'applicazione, probabilmente lo sarebbe.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top