EF base de simultanéité lors de l'utilisation de plusieurs instances

0

La question

J'ai un code similaire à ceci:

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

Si ce code fonctionne sur plusieurs instances d'un microsevice, une simultanéité problème se produit-il? (I. e. deux services seront mis à même ensemble d'enregistrements). Et si oui, comment puis - je l'empêcher?

Je tiens à prévenir mes services de se même les enregistrements de DB si ils appellent cette méthode simultanément.

2

La meilleure réponse

1

Vous pouvez récupérer les lignes avec une procédure stockée exécutée dans une transaction sérialisable. Vous pourriez voulez que d'autres attributs de la table, quelque chose comme AssignedTo qui enregistre le service affecté à la ligne, et un autre attribut indiquant que le traitement est terminé. Sinon, si le service récupère quelques lignes, mais ne parvient pas avant d'avoir terminé toutes les opérations de traitement, ces lignes ne sont toujours pas traités. Lorsqu'un service récupère les lignes, il peut utiliser un état comme la AssignedTo = auto Ou AssignedTo Est Null. Sans doute il est également un horodatage ou de quelque autre façon à prioriser les lignes sélectionnées.

2021-11-23 23:26:52
1

Oui, ça va, et c'est peut-être pas si facile de l'éviter.

Imaginez ces services sont chargés de mettre à jour les soldes de compte. Ils ont lu l'équilibre, et ajouter le montant du dépôt de celle-ci:

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.

Vous devrez présenter une étendue de transaction, le gérer avec le redis peut-être, de sorte que chaque instance a un point de la vérité pour vérifier si il est ok pour entrer et sortir de la mise à jour de la portée. Un "IsProcessing? ou SetIsProcessing" sur le réseau, si vous voulez.

2021-11-23 21:26:46

Dans d'autres langues

Cette page est dans d'autres langues

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