I blocchi vengono presi durante (di solito all'inizio o vicino a) l'esecuzione di un comando. I blocchi (tranne i blocchi di avviso) vengono rilasciati solo quando una transazione esegue il commit o il rollback. Non ci sono FOR UNLOCK
, né esiste un UNLOCK
comando per invertire gli effetti del LOCK
a livello di tabella comando. Tutto questo è spiegato nella sezione sul controllo della concorrenza della documentazione di PostgreSQL.
Devi eseguire il commit o il rollback della transazione per rilasciare i blocchi.
Inoltre, non ha molto senso chiedere "questa riga è già stata eliminata da un'altra transazione simultanea". Non viene effettivamente eliminata fino a quando la transazione che ha eliminato la riga non esegue il commit... e anche in questo caso, potrebbe aver eliminato e reinserito la riga o un'altra transazione simultanea potrebbe aver inserito di nuovo la riga.
Stai costruendo per caso una coda di attività o un sistema di coda di messaggi, perché in tal caso, il problema è risolto e non dovresti provare a reinventare quella ruota insolitamente complicata. Vedi PGQ, ActiveMQ, RabbitMQ, ZeroMQ, ecc. (le versioni future di PostgreSQL possono includere FOR UPDATE SKIP LOCKED
poiché è in fase di test, ma non è stato rilasciato al momento della scrittura).
Ti suggerisco di pubblicare una nuova domanda con una descrizione più dettagliata del problema di fondo che stai cercando di risolvere. Stai presumendo che la soluzione al tuo problema sia "scopri se la riga è già stata eliminata" o "sblocca la riga". Probabilmente non è in realtà la soluzione. È un po' come qualcuno che dice "dove compro la benzina" quando la sua bici a spinta non va, quindi presume che sia senza carburante. La benzina non è il problema, il problema è che le bici a spinta non prendono benzina e devi pedalarle.
Spiega lo sfondo. Spiega cosa stai cercando di ottenere. Soprattutto, non pubblicare pseudocodice, pubblica il codice effettivo con cui stai riscontrando problemi , preferibilmente in una forma autonoma ed eseguibile.