Mysql
 sql >> Base de données >  >> RDS >> Mysql

Incrément atomique avec Entity Framework

Avec Entity Framework, vous ne pouvez pas en faire une opération "atomique". Vous avez les étapes :

  1. Charger l'entité depuis la base de données
  2. Changer le compteur en mémoire
  3. Enregistrer l'entité modifiée dans la base de données

Entre ces étapes, un autre client peut charger l'entité de la base de données qui a toujours l'ancienne valeur.

La meilleure façon de gérer cette situation est d'utiliser la concurrence optimiste . Cela signifie essentiellement que la modification de l'étape 3 ne sera pas enregistrée si le compteur n'est plus le même que lorsque vous avez chargé l'entité à l'étape 1. Au lieu de cela, vous obtiendrez une exception que vous pourrez gérer en rechargeant l'entité et réappliquer la modification.

Le flux de travail ressemblerait à ceci :

  • Dans le Work entité le WordCount la propriété doit être marquée comme un jeton de concurrence (annotations ou API Fluent dans le cas de Code-First)
  • Charger l'entité depuis la base de données
  • Changer le compteur en mémoire
  • Appelez SaveChanges dans un try-catch bloquer et intercepter les exceptions de type DbUpdateConcurrencyException
  • Si une exception se produit, rechargez l'entité dans le catch bloc de la base de données, appliquez à nouveau la modification et appelez SaveChanges encore
  • Répétez la dernière étape jusqu'à ce qu'il n'y ait plus d'exception

Dans cette réponse vous pouvez trouver un exemple de code pour cette procédure (en utilisant DbContext ).