EF core souběžnosti při použití více instancí

0

Otázka

Mám kód podobný tomuto:

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

Pokud tento kód běží na několika instancí microsevice, může problém souběžnosti stalo? (I. e. dvě služby budou mít stejnou sadu záznamů). A pokud ano - jak mám zabránit?

Chci, aby se zabránilo mé služby, od získání stejné záznamy z DB, když se volání této metody současně.

2

Nejlepší odpověď

1

Můžete načíst řádky s uložené procedury, běží v serializable transakce. Možná budete chtít další atributy v tabulce, něco jako rozděleni do které zaznamenává služby přiřazené k tomuto řádku, a další atribut označující zpracování bylo dokončeno. Jinak, pokud služba načte některé řádky, ale selže před dokončením všech zpracování, tyto řádky zůstávají nezpracované. Když služba načte řádky, můžete použít stav, jako rozděleni do = self Nebo rozděleni do Is Null. Pravděpodobně tam je také časové razítko nebo nějaký jiný způsob, jak upřednostnit vybrané řádky.

2021-11-23 23:26:52
1

Ano, to bude, a to nemusí být tak snadné, aby se zabránilo to.

Představte si, že tyto služby mají za úkol aktualizovat zůstatky na účtech. Čtou zůstatek, a přidejte 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 muset zavést oboru transakce, spravovat ji s redis možná, tak, že každá instance má bod pravdu zkontrolovat, jestli je to v pořádku se dostat dovnitř a ven z aktualizace působnosti. "IsProcessing? nebo SetIsProcessing" po síti, pokud budete.

2021-11-23 21:26:46

V jiných jazycích

Tato stránka je v jiných jazycích

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