sql >> Database teknologi >  >> RDS >> Mysql

Atomic Increment med Entity Framework

Med Entity Framework kan du ikke gøre dette til en "atomisk" operation. Du har trinene:

  1. Indlæs entitet fra databasen
  2. Skift tæller i hukommelsen
  3. Gem ændret enhed i databasen

Ind imellem disse trin kan en anden klient indlæse entiteten fra databasen, som stadig har den gamle værdi.

Den bedste måde at håndtere denne situation på er at bruge optimistisk samtidighed . Det betyder grundlæggende, at ændringen i trin 3 ikke bliver gemt, hvis tælleren ikke længere er den samme, som den var, da du indlæste entiteten i trin 1. I stedet får du en undtagelse, som du kan håndtere ved at genindlæse entiteten og genanvender ændringen.

Arbejdsgangen ville se sådan ud:

  • I Work entitet WordCount egenskab skal markeres som et samtidighedstoken (annotationer eller Fluent API i tilfælde af Code-First)
  • Indlæs entitet fra databasen
  • Skift tæller i hukommelsen
  • Ring til SaveChanges i en try-catch blokere og fange undtagelser af typen DbUpdateConcurrencyException
  • Hvis der opstår en undtagelse, genindlæs entiteten i catch blokere fra databasen, anvend ændringen igen og kald SaveChanges igen
  • Gentag det sidste trin, indtil der ikke længere forekommer nogen undtagelse

I dette svar du kan finde et kodeeksempel for denne procedure (ved at bruge DbContext ).



  1. MySQL SUM() giver forkert total

  2. Indstil PDO til at kaste undtagelser som standard

  3. Hvordan kan jeg opnå initcap-funktionalitet i MySQL?

  4. SQL vælg max(dato) og tilsvarende værdi