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.