PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Sperren einer bestimmten Zeile in Postgres

Wenn Sie die Tabelle in einer bestimmten ausgewählten Zeile sperren möchten, müssen Sie LOCK FIRST sie verwenden den FOR UPDATE / FOR SHARE Anweisung. Zum Beispiel, in Ihrem Fall, wenn Sie die erste Zeile sperren müssen, tun Sie dies:

BEGIN;

LOCK TABLE person IN ROW EXCLUSIVE MODE;

-- BLOCK 1

SELECT * FROM person WHERE name = 'John' and money = 1 FOR UPDATE;

-- BLOCK 2

UPDATE person set name = 'John 2' WHERE name = 'John' and money = 1;

END;

Im BLOCK1 vor dem SELECT Anweisung tun Sie nichts, sagen Sie der Datenbank nur:"Hey, ich werde etwas in dieser Tabelle tun, also sperren Sie diese Tabelle in diesem Modus, wenn ich dies tue". Sie können jede Zeile auswählen / aktualisieren / löschen.

Aber in BLOCK2 wenn Sie FOR UPDATE verwenden Sie sperren diese Zeile für andere Transaktionen in bestimmten Modi (lesen Sie das doc für mehr Details). Wird gesperrt, bis diese Transaktion endet.

Wenn Sie ein Beispiel brauchen, machen Sie einen Test und versuchen Sie es mit einem weiteren SELECT ... FOR UPDATE in BLOCK2 vor Ende der ersten Transaktion. Es wartet auf das Ende der ersten Transaktion und wählt direkt danach aus.

Ich verwende es in einer Funktion zur Steuerung von Untersequenzen und es ist großartig. Hoffe es gefällt euch.