Il n'y a pas de ORDER BY dans la UPDATE commande.
Mais il y en a pour SELECT . Utilisez verrouillage au niveau de la ligne
avec le FOR UPDATE clause
dans une sous-requête :
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;
Bien sûr, b doit être UNIQUE ou vous devez ajouter plus d'expressions au ORDER BY clause pour la rendre sans ambiguïté.
Et vous devez appliquer la même commande pour tous UPDATE , DELETE et SELECT .. FOR UPDATE déclarations sur la table.
Connexe, avec plus de détails :
- MISE À JOUR Postgres… LIMITE 1
- Éviter les interblocages PostgreSQL lors de l'exécution d'opérations de mise à jour et de suppression en masse
- Optimisation des mises à jour simultanées dans Postgres