sql >> Databasteknik >  >> RDS >> Mysql

Atomic Increment med Entity Framework

Med Entity Framework kan du inte göra detta till en "atomär" operation. Du har stegen:

  1. Ladda entitet från databasen
  2. Ändra räknare i minnet
  3. Spara ändrad enhet i databasen

Mellan dessa steg kan en annan klient ladda entiteten från databasen som fortfarande har det gamla värdet.

Det bästa sättet att hantera denna situation är att använda optimistisk samtidighet . Det betyder i princip att ändringen i steg 3 inte kommer att sparas om räknaren inte längre är densamma som den var när du laddade enheten i steg 1. Istället får du ett undantag som du kan hantera genom att ladda om enheten och tillämpar ändringen igen.

Arbetsflödet skulle se ut så här:

  • I Work enhet WordCount egendom måste markeras som en samtidighetstoken (kommentarer eller Fluent API vid Code-First)
  • Ladda entitet från databasen
  • Ändra räknare i minnet
  • Ring SaveChanges i en try-catch blockera och fånga undantag av typen DbUpdateConcurrencyException
  • Om ett undantag inträffar, ladda om enheten i catch blockera från databasen, tillämpa ändringen igen och anropa SaveChanges igen
  • Upprepa det sista steget tills inget undantag inträffar längre

I det här svaret du kan hitta ett kodexempel för denna procedur (med DbContext ).



  1. MariaDB Varning:'[email protected]' har både ... Lösenordet kommer att ignoreras

  2. MySQL-Prestanda vid beställning på beräknad kolumn

  3. Hur man går med i MySQL och Postgres i en levande materialiserad vy

  4. Förhindra automatisk inkrement på MySQL dubblett infogning