Domanda

Attualmente sto aggiungendo test unitari a una quantità piuttosto grande di procedure memorizzate da PostgreSQL, utilizzando PGTAP.

Alcune delle procedure eseguono operazioni che bloccano esplicitamente le righe. Questi blocchi sono fondamentali per l'applicazione.

Come posso scrivere test che controllano che le righe che devono essere bloccate siano state e che le righe che non dovrebbero essere bloccate non lo sono?

L'unico "indizio" che ho al momento è l'estensione PGROWLOCKS, che consente a una transazione di verificare la presenza di righe bloccate da un'altra transazione. Tuttavia, l'attuale transazione non sembra vedere i suoi blocchi, quindi dovrei usare qualcosa per sincronizzare due transazioni e, a meno che non mi sborzi, non c'è modo di farlo usando PGTAP.

(Nota: utilizzando PostgreSQL 9.1)

È stato utile?

Soluzione

Se riesci a identificare il CTID delle righe in questione e sapere quale transazione dovrebbe bloccare le righe, forse potresti usare l'estensione di PageSpect e guardare i flag di Info Tuple e Xmax? I flag di informazioni dovrebbero indicare che la riga è bloccata e Xmax deve essere impostato sull'ID transazione che lo tiene.

Altri suggerimenti

Come posso scrivere test che controllano che le righe che devono essere bloccate siano state e che le righe che non dovrebbero essere bloccate non lo sono?

Apri la transazione separata, prova a bloccare la stessa riga con oggi e prendi l'eccezione.

PostgreSQL non ha alcun supporto per le transazioni autonome, quindi - per aprire una transazione separata dal test PGTAP, dovrai ricorrere a dblink o altre estensioni simili.

Ps. Ho trovato questo link, dove Robert Haas spiega, perché le tuple a livello di riga non sono tracciate in pg_locks:

(...) Le serrature di tupla non gravate si presentano in pg_locks, ma scompaiono una volta concessi. (PostgreSQL avrebbe esaurito lo spazio della tabella di blocco anche su una selezione di medie dimensioni per la query di aggiornamento se non lo facessimo.)

D'altra parte, non capisco bene perché vuoi testare l'esistenza di blocco - è garantito dopo il comando di blocco di successo.

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