Nie ma ORDER BY
w UPDATE
polecenie.
Ale jest dla SELECT
. Użyj blokowania na poziomie wiersza
z FOR UPDATE
klauzula
w podzapytaniu:
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;
Oczywiście b
musi być UNIQUE
lub musisz dodać więcej wyrażeń do ORDER BY
klauzula, aby była jednoznaczna.
Musisz wymusić tę samą kolejność dla wszystkich UPDATE
, DELETE
i SELECT .. FOR UPDATE
oświadczenia na stole.
Powiązane, więcej szczegółów:
- AKTUALIZACJA Postgres… LIMIT 1
- Unikanie zakleszczeń PostgreSQL podczas wykonywania operacji zbiorczej aktualizacji i usuwania
- Optymalizacja jednoczesnych aktualizacji w Postgresie