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