Es gibt kein ORDER BY
im UPDATE
Befehl.
Aber es gibt für SELECT
. Verwenden Sie Sperren auf Zeilenebene
mit dem Code <>ZUR AKTUALISIERUNG Klausel
in einer Unterabfrage:
UPDATE foo f
SET a = 1
FROM (
SELECT b FROM foo
WHERE b IN (1,2,3,4)
ORDER BY b
FOR UPDATE
) upd
WHERE f.b = upd.b;
Natürlich b
muss UNIQUE
sein oder Sie müssen dem ORDER BY
weitere Ausdrücke hinzufügen Klausel, um es eindeutig zu machen.
Und Sie müssen dieselbe Reihenfolge für alle durchsetzen AKTUALISIEREN
, LÖSCHEN
und SELECT .. FOR UPDATE
Aussagen auf dem Tisch.
Verwandte, mit mehr Details:
- Postgres-UPDATE … LIMIT 1
- Vermeidung von PostgreSQL-Deadlocks bei Massenaktualisierungen und Löschvorgängen
- Optimierung gleichzeitiger Updates in Postgres