Birden çok örneği kullanırken EF çekirdek eşzamanlılığı

0

Soru

Buna benzer bir kodum var:

var records = db.Records.Where(r => r.IsProcessing == false).Take(100).ToList();
records.IsProcessing = true;
await db.SaveChangesAsync()
...further work with recods

Eşzamanlılık bir sorun, bu kodu bir microsevice birkaç örneği üzerinde çalışır, neler yapar? (Yani, iki hizmet aynı kayıt kümesini alacaktır). Ve eğer evet ise-bunu nasıl önleyebilirim?

Bu yöntemi aynı anda çağırırlarsa, hizmetlerimin dB'den aynı kayıtları almasını engellemek istiyorum.

2

En iyi cevabı

1

Satırları seri hale getirilebilir bir işlemde çalışan saklı yordamla alabilirsiniz. Tablodaki diğer öznitelikleri, o satıra atanan hizmeti kaydeden AssignedTo ve işlemin tamamlandığını belirten başka bir öznitelik gibi bir şey isteyebilirsiniz. Aksi halde, hizmet bazı satırları alır ancak tüm işlemleri tamamlamadan önce başarısız olursa, bu satırlar işlenmemiş kalır. Bir hizmet satırları aldığında, AssignedTo = self Veya AssignedTo Is Null gibi bir koşul kullanabilir. Muhtemelen seçilen satırlara öncelik vermek için bir zaman damgası veya başka bir yol da vardır.

2021-11-23 23:26:52
1

Evet, olacak ve bunu önlemek o kadar kolay olmayabilir.

Bu hizmetlerin hesap bakiyelerini güncellemekle görevli olduğunu düşünün. Bakiyeyi okurlar ve üzerine depozito tutarı eklerler:

service 1: on a busy machine (slow)
service 2: on a not so busy machine (fast)
"john" has £100 on his account
service 1: read
service 2: read
service 1: balance = balance + 100;
service 2: balance = balance + 100;
service 2: set processing = true
service 2: set processing = true
service 2: update record
service 1: update record.
john ends up with £200 instead of £300.

Bir işlem kapsamı girmeniz, redis ile yönetmeniz gerekebilir, böylece, her örneğin güncelleme kapsamına girip çıkmanın uygun olup olmadığını kontrol etmek için bir doğruluk noktası vardır. Bir " İsProcessing? veya ağ üzerinden" SetİsProcessing " yapacaksanız.

2021-11-23 21:26:46

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................