EF core súbežnosť ak používate viaceré inštancie

0

Otázka

Mám kód podobnú tejto:

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

Ak tento kód beží na viacerých inštancií microsevice, môže súbežnosť problém stalo? (I. e. dve služby budú mať rovnaké záznamy). A ak áno - ako mám tomu zabrániť?

Chcem, aby sa zabránilo moje služby zo dostať rovnaké záznamy z databázy, ak sú na hovor táto metóda súčasne.

2

Najlepšiu odpoveď

1

Mohli by ste vybrať riadky s uloženej procedúry, beží v serializable transakcie. Možno budete chcieť, ostatné atribúty v tabuľke, niečo ako AssignedTo ktorý zaznamenáva služby priradené sebou, a ďalší atribút označujúci spracovanie bolo dokončené. Inak, ak služba vyberie nejaké riadky, ale zlyhá pred dokončením všetkých spracovanie, tieto riadky zostávajú nespracovaný. Ak služba načíta riadky, môže použiť stave ako AssignedTo = samostatne Alebo AssignedTo Je Null. Pravdepodobne je tam aj časovú pečiatku, alebo iným spôsobom uprednostňovať vybraných riadkov.

2021-11-23 23:26:52
1

Áno, to bude, a to nemusí byť tak jednoduché, aby tomu zabránil.

Predstavte si, že tieto služby majú za úlohu aktualizovať zostatku na účte. Prečítali si rovnováhu, a pridať vkladu na to:

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.

Budete musieť zaviesť transakcie rozsahu, riadiť ho s redis možno, tak, že každá inštancia má miesto pravdy, ak chcete skontrolovať, či je v poriadku, ak sa dostať do a z aktualizáciu rozsahu. A "IsProcessing? alebo SetIsProcessing" cez sieť, ak budete.

2021-11-23 21:26:46

V iných jazykoch

Táto stránka je v iných jazykoch

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