EF core della concorrenza quando si utilizzano più istanze

0

Domanda

Ho un codice simile a questo:

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

Se questo codice viene eseguito su più istanze di un microsevice, è possibile che un problema di concorrenza accadere? (I. e. due servizi saranno mostrati stesso set di record). E se sì, come posso prevenire?

Vorrei evitare che i miei servizi da raggiungere record dal DB se chiamano questo metodo contemporaneamente.

2

Migliore risposta

1

Si possono recuperare le righe con una stored procedure, l'esecuzione di una transazione serializzabile. Si potrebbe desiderare gli altri attributi della tabella, qualcosa di simile a Assegnatoa che registra il servizio assegnato a quella riga, e un altro attributo che indica il trattamento è stato completato. In caso contrario, se il servizio recupera alcune righe, ma non prima di aver completato tutte le lavorazioni, le righe rimangono non trasformati. Quando un servizio recupera le righe, è possibile utilizzare una condizione come Assegnatoa = auto O Assegnatoa È Null. Presumibilmente c'è anche un timestamp o qualche altro modo per dare priorità alle righe selezionate.

2021-11-23 23:26:52
1

Sì, ci sarà, e non può essere così facile da evitare.

Immaginate di questi servizi hanno il compito di aggiornare i saldi di conto. Leggono l'equilibrio, e aggiungere l'importo del deposito su di esso:

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.

È necessario introdurre un ambito di transazione, di gestire con redis forse, in modo che ogni istanza ha un punto di verità per verificare se è ok per entrare e uscire di aggiornamento di ambito. Un "IsProcessing? o SetIsProcessing" oltre la rete, se volete.

2021-11-23 21:26:46

In altre lingue

Questa pagina è in altre lingue

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