EF core concurenta atunci când se utilizează mai multe instanțe

0

Problema

Am cod similar cu acesta:

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

Dacă acest cod ruleaza pe mai multe cazuri de o microsevice, poate o concurenta problema se întâmple? (I. e. două servicii vor obține același set de înregistrări). Și dacă da - cum pot preveni asta?

Vreau să prevină serviciile mele la obtinerea de date din DB dacă vor apela la aceasta metoda simultan.

2

Cel mai bun răspuns

1

Ai putea prelua rânduri cu o procedură stocată, care rulează într-un serializable tranzacție. Poate vrei alte atribute în tabel, ceva de genul delegat într-ce înregistrări de servicii atribuite la rând, și un alt atribut care indică prelucrarea a fost finalizat. În caz contrar, dacă serviciul preia unele rânduri, dar nu înainte de finalizarea tuturor prelucrare, aceste rânduri rămân neprelucrate. Atunci când un serviciu preia rânduri, se poate folosi o condiție ca delegat într = auto Sau delegat într-Este Nul. Probabil există, de asemenea, o amprentă de timp sau un alt mod de a prioritiza rândurile selectate.

2021-11-23 23:26:52
1

Da, va fi, și ea nu poate fi atât de ușor de a preveni.

Imaginați-vă aceste servicii sunt însărcinat să actualizare solduri de cont. Au citit echilibrul, și se adaugă suma depozitului pe ea:

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.

Va trebui să introducă o tranzacție domeniul de aplicare, de a gestiona cu redis poate, așa că fiecare instanță are un punct de adevărul pentru a verifica dacă e ok să intri și să ieși de actualizare aplicare. Un "IsProcessing? sau SetIsProcessing" în rețea, dacă vrei.

2021-11-23 21:26:46

În alte limbi

Această pagină este în alte limbi

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