Ich habe eine Funktion, die ein langes Update für mehrere große Tabellen durchführen muss. Während des Updates müssen 2-3 Tabellen gleichzeitig im EXCLUSIVE-Modus gesperrt werden.
Da nicht alle Tabellen gleichzeitig gesperrt werden müssen, möchte ich idealerweise nur die Tabellen sperren, die ich gerade aktualisiere, und dann die Sperre entfernen, sobald ich fertig bin.
ZB
%Vor%Leider gibt es in plpgsql kein Äquivalent zur UNLOCK-Anweisung. Der normale Weg, um LOCK zu entfernen, ist das COMMIT der Transaktion, aber das ist innerhalb einer Funktion nicht möglich.
Gibt es dafür eine Lösung? Eine Möglichkeit, die Sperre explizit aufzuheben, bevor die Funktion ausgeführt wird? Oder führen Sie eine Art Untertransaktion durch (vielleicht indem Sie jedes Update in einer separaten Funktion ausführen)?
AKTUALISIEREN
Ich habe akzeptiert, dass es keine Lösung gibt. Ich schreibe jedes Update in eine separate Funktion und koordiniere von außerhalb der db. Danke an alle.
Es gibt keine Möglichkeit . Funktionen in Postgres sind atomar (immer in einer Transaktion) und Sperren werden am Ende einer Transaktion freigegeben. Und es gibt (noch) keine autonomen Transaktionen.
Sie können dies möglicherweise mit Advisory-Sperren
Codebeispiel auf dba.SE:
Oder Sie könnten irgendwo mit "betrügerischen" autonomen Transaktionen mit dblink:
Oder Sie bewerten Ihr Problem neu und teilen es in ein paar separate Transaktionen auf.
Nicht möglich. Aus der Dokumentation: Einmal erworben, wird normalerweise bis zum Ende der Transaktion eine Sperre gehalten. Wenn jedoch nach dem Einrichten eines Sicherungspunkts eine Sperre erfasst wird, wird die Sperre sofort aufgehoben, wenn auf den Sicherungspunkt zurückgesetzt wird. Dies steht im Einklang mit dem Prinzip, dass ROLLBACK alle Effekte der Befehle seit dem Sicherungspunkt löscht. Dasselbe gilt für Sperren, die innerhalb eines PL / pgSQL-Ausnahmeblocks erfasst wurden: Ein Fehler-Escape aus dem Block gibt die darin enthaltenen Sperren frei.
Tags und Links sql postgresql plpgsql