sql >> Database >  >> RDS >> Mysql

Atomic Increment met Entity Framework

Met Entity Framework kun je hier geen "atomaire" operatie van maken. Je hebt de stappen:

  1. Entiteit laden uit database
  2. Wijzig teller in geheugen
  3. Gewijzigde entiteit opslaan in database

Tussen deze stappen door kan een andere klant de entiteit laden uit de database die nog de oude waarde heeft.

De beste manier om met deze situatie om te gaan, is door gebruik te maken van optimistische gelijktijdigheid . Het betekent in feite dat de wijziging in stap 3 niet wordt opgeslagen als de teller niet meer hetzelfde is als toen u de entiteit in stap 1 laadde. In plaats daarvan krijgt u een uitzondering die u kunt afhandelen door de entiteit opnieuw te laden en de wijziging opnieuw toepassen.

De workflow ziet er als volgt uit:

  • In het Work entiteit de WordCount eigenschap moet worden gemarkeerd als een gelijktijdigheidstoken (annotaties of Fluent API in het geval van Code-First)
  • Entiteit laden uit database
  • Wijzig teller in geheugen
  • Bel SaveChanges in een try-catch blok en vang uitzonderingen van het type DbUpdateConcurrencyException
  • Als er een uitzondering optreedt, laadt u de entiteit opnieuw in de catch blok uit de database, pas de wijziging opnieuw toe en bel SaveChanges nogmaals
  • Herhaal de laatste stap totdat er geen uitzondering meer optreedt

In dit antwoord u kunt een codevoorbeeld voor deze procedure vinden (met behulp van DbContext ).



  1. Hoe ALLE logische operatoren in SQL Server te gebruiken - SQL Server / TSQL-zelfstudie, deel 126

  2. Hoe meerdere rijen samenvoegen in MySQL?

  3. Sqlplus-aanmeldingsfout bij gebruik van bash-variabelen:SP2-0306:Ongeldige optie

  4. Een variabele declareren in een PostgreSQL-query