2016-08-03 34 views
0

freigegeben Ich schreibe eine Funktion, die auf eine Tabelle sperrt und führt Update-Vorgang. Und hier verwende ich eine Erweiterung, um eine Zeichenfolge zu hacken und hier besteht die Möglichkeit eines Fehlers.Wie wird eine Postgres-Sperre auf Ausnahme

Jetzt ist meine Frage. Wie stelle ich sicher, dass die Sperre im Falle einer Ausnahme aufgehoben wird?

Ich verwende das Schloss im Modus "IN ACCESS EXCLUSIVE".

+0

Cross-Post: https://dba.stackexchange.com/q/145708/1822 –

Antwort

1

Eine Sperre wird normalerweise am Ende der Transaktion ausgelöst. Da eine Funktion keine Transaktionsverarbeitung ausführen kann, kann die Sperre in die Funktion nicht wirklich freigeben. Der Code, der die Funktion aufruft, muss die Transaktion ordnungsgemäß festschreiben oder zurücksetzen, um die Sperre aufzuheben.

Eine andere Option ist die Verwendung eines Sicherungspunkts vor dem Erfassen des Schlosses. In diesem Fall können Sie im Ausnahmebehandler auf den Sicherungspunkt zurücksetzen, um die Sperre aufzuheben.

Beachten Sie, dass die Sperre nicht aufgehoben wird, wenn alles in Ordnung ist (und auch die aktuelle Transaktion nicht beendet wird). Sie müssen die Transaktion noch im Code beenden, der die Funktion aufruft

+0

Falls alles in Ordnung ist, rufe ich die Funktion in einem Begin auf -Verpflichten; Block. Beendet das die Transaktion? BEGIN; \t SPERRTABELLE my_table IN ACCESS EXCLUSIVE MODE; \t SELECT my_function(); COMMIT; –

+0

@MukundGandlur: Wenn Sie einen Commit oder Rollback vom aufrufenden Code ausführen, wird der Sicherungspunkt in der Funktion nicht wirklich benötigt. Stellen Sie nur sicher, dass Sie die Transaktion ordnungsgemäß beenden. –