Come verificare le operazioni in sospeso in una transazione PostgreSQL
-
22-07-2019 - |
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.
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.