Ho una funzione che deve eseguire un aggiornamento lungo su più tabelle di grandi dimensioni. Durante l'aggiornamento 2-3 tabelle alla volta devono essere bloccate in modalità ESCLUSIVA.PostgreSQL ottiene e rilascia BLOCCO all'interno della funzione memorizzata
Poiché non tutti i tavoli devono essere bloccati allo stesso tempo, idealmente vorrei BLOCCARE solo quei tavoli che sto aggiornando in quel momento, e quindi rimuovere il lucchetto una volta fatto.
Es.
-- Lock first pair of tables
LOCK TABLE tbl1_a IN EXCLUSIVE MODE;
LOCK TABLE tbl1_b IN EXCLUSIVE MODE;
-- Perform the update on tbl1_a and tbl1_b
-- Release the locks on tbl1_a and tbl1_b
-- HOW???
-- Proceed to the next pair of tables
LOCK TABLE tbl2_a IN EXCLUSIVE MODE;
LOCK TABLE tbl2_b IN EXCLUSIVE MODE;
Sfortunatamente, non esiste l'equivalente dell'istruzione UNLOCK in plpgsql. Il modo normale per rimuovere LOCK consiste nel COMMITARE la transazione, ma ciò non è possibile all'interno di una funzione.
C'è qualche soluzione per questo? Un modo per rilasciare esplicitamente il blocco prima che la funzione venga eseguita? O eseguire una sorta di sotto-transazione (magari eseguendo ogni aggiornamento in una funzione separata)?
UPDATE
ho accettato che non esiste una soluzione. Scriverò ogni aggiornamento in una funzione separata e coordinerò dall'esterno del db. Grazie a tutti.