Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Atomic Increment mit Entity Framework

Mit Entity Framework können Sie dies nicht zu einer "atomaren" Operation machen. Sie haben die Schritte:

  1. Entität aus Datenbank laden
  2. Zähler im Speicher ändern
  3. Geänderte Entität in Datenbank speichern

Zwischen diesen Schritten kann ein anderer Client die Entität aus der Datenbank laden, die noch den alten Wert hat.

Der beste Weg, mit dieser Situation umzugehen, ist die Verwendung von optimistischer Parallelität . Dies bedeutet im Grunde, dass die Änderung in Schritt 3 nicht gespeichert wird, wenn der Zähler nicht mehr derselbe ist wie beim Laden der Entität in Schritt 1. Stattdessen erhalten Sie eine Ausnahme, die Sie durch erneutes Laden der Entität und behandeln können die Änderung erneut anwenden.

Der Arbeitsablauf würde wie folgt aussehen:

  • In der Work Entität der WordCount -Eigenschaft muss als Parallelitätstoken gekennzeichnet sein (Anmerkungen oder Fluent-API im Fall von Code-First)
  • Entität aus Datenbank laden
  • Zähler im Speicher ändern
  • Rufen Sie SaveChanges auf in einem try-catch Ausnahmen vom Typ DbUpdateConcurrencyException blockieren und abfangen
  • Wenn eine Ausnahme auftritt, laden Sie die Entität neu in den catch Block aus der Datenbank, wenden Sie die Änderung erneut an und rufen Sie SaveChanges auf wieder
  • Wiederholen Sie den letzten Schritt, bis keine Ausnahme mehr auftritt

In dieser Antwort finden Sie ein Codebeispiel für dieses Verfahren (unter Verwendung von DbContext ).