Mit dem LOCK TABLE-Befehl können Sie eine Tabelle in der aktuellen Datenbank sperren. Der Sperrmodus gibt den Typ der anzufordernden Sperre an.
Der LOCK TABLE-Befehl ist erfolgreich, wenn eine Sperre mit dem angegebenen Modus für die Tabelle angefordert werden kann. Der Befehl wartet so lange wie erforderlich auf das Abrufen der Sperre, wenn Sie nicht die Option NOWAIT angeben, die bewirkt, dass der Befehl die Transaktion abbricht, falls er die Sperre nicht sofort anfordern kann.
Eine Sperre ist aktiv, bis für die Transaktion ein Commit durchgeführt wird oder die Transaktion abgebrochen wird. Wenn LOCK TABLE implizit (d. h. nicht in einem BEGIN-/COMMIT-Paar) abgesetzt wird, fordert der Befehl die Sperre an, sobald dies zulässig ist, und gibt sie dann sofort frei, da er eine Einzelanweisungstransaktion ist, die nach Abschluss des Befehls implizit ein Commit durchführt.
Soweit dies möglich ist, sollten LOCK TABLE-Befehle vor Abfragen in der Transaktion abgesetzt werden. Das Anfordern einer Sperre nach dem Absetzen einer Abfrage für Benutzertabellen schützt eine Transaktion nicht zwangsläufig vor Serialisierungsfehlern.
Wenn Sie planen, LOCK TABLE-Befehle innerhalb einer Transaktion für mehrere Tabellen abzusetzen, setzen Sie die Befehle in einer Reihenfolge ab, die von der Anwendung festgelegt wird. Dies minimiert die Möglichkeit von Deadlocks. Wenn ein Deadlock auftritt, bricht Postgres eine der am Deadlock beteiligten Transaktionen ab.
In der folgenden Tabelle ist die Matrix von Sperrenkonflikten dargestellt, die besagt, welche Sperren andere Typen von Sperren blockieren können. Ein Sperrmodus steht im Konflikt mit einem anderen Modus, falls einer Transaktion eine Sperre nicht erteilt werden kann, wenn eine andere Transaktion ebenfalls eine Sperre für dieselbe Tabelle definiert. Sperren, die von derselben Transaktion definiert werden, stehen nicht im Konflikt miteinander; eine Transaktion kann Sperren mit verschiedenen Modi für dieselbe Tabelle definieren. Wenn mehrere Sperren für dieselbe Tabelle angefordert werden sollen, fordern Sie stärkere Sperren zuerst an, um die Möglichkeit von Deadlocks zu minimieren. Wenn eine Transaktion zwei Sperren für dieselbe Tabelle benötigt, wobei keine von beiden stärker ist (insbesondere SHARE und ROW EXCLUSIVE), ist es oft sinnvoll, einen Sperrmodus zu verwenden, der beide Modi umfasst, wie SHARE ROW EXCLUSIVE.
| ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE | |
|---|---|---|---|---|---|---|---|
| ACCESS SHARE | OK | OK | OK | OK | OK | OK | Konflikt |
| ROW SHARE | OK | OK | OK | OK | OK | Konflikt | Konflikt |
| ROW EXLUSIVE | OK | OK | OK | Konflikt | Konflikt | Konflikt | Konflikt |
| SHARE | OK | OK | Konflikt | OK | Konflikt | Konflikt | Konflikt |
| SHARE ROW EXCLUSIVE | OK | OK | Konflikt | Konflikt | Konflikt | Konflikt | Konflikt |
| EXCLUSIVE | OK | Konflikt | Konflikt | Konflikt | Konflikt | Konflikt | Konflikt |
| ACCESS EXCLUSIVE | Konflikt | Konflikt | Konflikt | Konflikt | Konflikt | Konflikt | Konflikt |
LOCK TABLE <Tabelle> in <Sperrmodus> MODE [NOWAIT]
Der LOCK TABLE-Befehl akzeptiert folgende Eingaben:
| Eingabe | Beschreibung |
|---|---|
| <Tabelle> | Der Name der zu sperrenden Tabelle. |
| <Sperrmodus> | Der für die Tabelle anzufordernde Sperrentyp (siehe Tabelle 3). Das Wort ROW in einem Sperrmodus bezeichnet keine Sperre auf Zeilenebene. |
| NOWAIT | Der Befehl soll einen Fehler zurückgeben und die Transaktion abbrechen, wenn er die erforderliche Sperre nicht sofort anfordern kann. |
| Sperrmodus | Angefordert von | Erforderliche Berechtigungen | Hinweis |
|---|---|---|---|
| ACCESS SHARE | SELECT | Auswählen | Dies ist der schwächste Sperrmodus. Mehrere Transaktionen können diese Art der Sperre für eine Tabelle definieren. |
| ROW SHARE | Einfügen, löschen oder aktualisieren | Mehrere Transaktionen können diese Art der Sperre für eine Tabelle definieren. | |
| ROW EXCLUSIVE | INSERT, DELETE und UPDATE | Einfügen, löschen oder aktualisieren | Mehrere Transaktionen können diese Art der Sperre für eine Tabelle definieren. |
| SHARE | CREATE MATERIALIZED VIEW und GENERATE STATISTICS | Auswählen oder Genstats | Mehrere Transaktionen können diese Art der Sperre für eine Tabelle definieren. |
| SHARE ROW EXCLUSIVE | Einfügen, löschen oder aktualisieren | ||
| EXCLUSIVE | Einfügen, löschen oder aktualisieren | ||
| ACCESS EXCLUSIVE | DROP TABLE, ALTER TABLE und TRUNCATE TABLE | Löschen, ändern oder abschneiden |
Der LOCK TABLE-Befehl hat die folgenden Ausgaben:
| Ausgabe | Beschreibung |
|---|---|
| LOCK TABLE | Der Befehl war erfolgreich. |
| NOTICE: LOCK TABLE issued after query against user tables | Wenn ein LOCK TABLE-Befehl abgesetzt wird, nachdem die Transaktion eine Abfrage für Benutzertabellen abgesetzt hat, zeigt das System eine NOTICE-Nachricht an und der Befehl ist erfolgreich, wenn er die erforderliche Sperre anfordern kann. |
Sie müssen der Benutzer mit Administratorberechtigung, der Eigner der Tabelle oder der Eigner der Datenbank oder des Schemas sein, in der/dem die Tabelle definiert ist, oder Ihr Konto muss die entsprechenden Objektberechtigungen haben, wie sie in Tabelle 3 beschrieben sind.
LOCK TABLE customers IN ROW EXCLUSIVE MODE;