Hiçbir yoktur ORDER BYbir in SQL UPDATEkomutası. Postgres satırları keyfi sırada günceller:
Mutlak kesinliğe sahip kilitlenmeleri önlemek için, ifadelerinizi serileştirilebilir işlem yalıtımında çalıştırabilirsiniz . Ancak bu daha pahalıdır ve serileştirme arızasında komutları tekrarlamaya hazırlanmanız gerekir.
En iyi eylem yönteminiz muhtemelen SELECT ... ORDER BY ... FOR UPDATEbir alt sorguda veya SELECTbir işlemde bağımsız olarak açıkça kilitlenmektir - varsayılan olarak "tamamlandı" yalıtım düzeyi. Tom Lane'den pgsql-general'den alıntı :
İyi olmalı --- FOR UPDATE kilitleme her zaman SELECT boru hattındaki son adımdır.
Bu işi yapmalıdır:
BEGIN;
SELECT 1
FROM foo
WHERE baz = 1234
ORDER BY bar
FOR UPDATE;
UPDATE foo
SET bar = bar + 1
WHERE baz = 1234;
COMMIT;
Üzerinde çok sütunlu bir dizin (baz, bar)performans için mükemmel olabilir. Ancak barçok açık bir şekilde güncellendiğinden , tek sütunlu bir dizin (baz)daha da iyi olabilir. Birkaç faktöre bağlıdır. Kaç satır baz? Are SICAK güncellemeler çok sütun indeksi olmadan mümkün? ...
Eğer baz aynı anda güncellenir, beklenmedik bir hala var köşe vaka çakışmaları şans (belgelerine başına) :
İşlem yalıtım düzeyinde SELECTçalışan ve satırları sıra dışı döndürmek için bir kilitleme yan tümcesi READ COMMITTEDkullanan bir komut mümkündür ORDER BY. ...
Eğer kapsayan benzersiz kısıtlama olmalıdır Ayrıca, bar, bir düşünün DEFERRABLEkısıtlamayı aynı komuta kademelerinde benzersiz ihlallerini önlemek için. İlgili cevap:
CREATE TABLEKodu eklemenizi öneririm .