Hiçbir yoktur ORDER BY
bir in SQL UPDATE
komutası. 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 UPDATE
bir alt sorguda veya SELECT
bir 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 COMMITTED
kullanan 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 DEFERRABLE
kısıtlamayı aynı komuta kademelerinde benzersiz ihlallerini önlemek için. İlgili cevap:
CREATE TABLE
Kodu eklemenizi öneririm .