Atomic Increment mit Entity Framework

Ich habe einen MySQL Server habe ich Zugriff über Entity Framework 4.0. In der Datenbank habe ich eine Tabelle namens Funktioniert, in die einige zählt. Ich entwickle web-site mit Asp.net. Diese Tabelle acccesable ein Benutzer gleichen Zeit. Und diese situation führt zu falschen incerement problem.

Mein code so:

dbEntities myEntity = new dbEntities();

var currentWork = myEntity.works.Where(xXx => xXx.RID == 208).FirstOrDefault();
Console.WriteLine("Access work");

if (currentWork != null)
{
    Console.WriteLine("Access is not null");
    currentWork.WordCount += 5;//Default WordCount is 0
    Console.WriteLine("Count changed");
    myEntity.SaveChanges();
    Console.WriteLine("Save changes");
}
Console.WriteLine("Current Count:" + currentWork.WordCount);

Wenn man mehr als Faden auf die Datenbank zugreifen, wird nur die Letzte änderung bleiben.

Aktuellen Ausgabe:

t1: Thread-Eine - t2: Thread Zwei

t1: Zugang arbeiten

t2: Access arbeiten

t2: der Zugang ist nicht null

t1: Zugang ist nicht null

t1: Anzahl geändert

t2: Anzahl geändert

t1: Speichern Sie die änderungen

t2: Speichern Sie die änderungen

t1: Aktuelle Anzahl: 5

t2: Aktuelle Anzahl: 5

Erwartete Ausgabe:

t1: Zugang arbeiten

t2: Access arbeiten

t2: der Zugang ist nicht null

t1: Zugang ist nicht null

t1: Anzahl geändert

t2: Anzahl geändert

t1: Speichern Sie die änderungen

t2: Speichern Sie die änderungen

t1: Aktuelle Anzahl: 5

t2: Aktuelle Anzahl: 10

Weiß ich, warum apeear dieses problem, denn dieser code ist nicht atomar. Wie kann ich schalten atomarer Vorgang?

  • Ich weiß, MsSql Sie können Transaktionen haben, können Sie das gleiche tun in MySql? Ich weiß auch, dass SaveChanges() ermöglicht einen booleschen Wert, aber ich glaube nicht, dass das hilft in diesem Fall.
  • können Sie versuchen, diese, lock (currentWork ) { Console.WriteLine("Access is not null"); currentWork.WordCount += 5;//Default WordCount is 0 Console.WriteLine("Count changed"); myEntity.SaveChanges(); Console.WriteLine("Save changes"); } es hat eine Weile, da ich habe anständige threading
  • Oh, und übrigens: ein guter trick. Sie können Ihre where Zustand, innen Ihre first or default und entfernen Sie die where komplett.
  • dieser trick helfen die performance zu verbessern? oder trick kann helfen, besser lesbar-Abfrage?
  • Ich denke, es macht es besser lesbar, aber ich bin mir nicht sicher auf die performance. Ich nehme an, es wird where für Sie. Nützlich, wenn Sie große Abfragen.
  • vielleicht ist dies nützlich, stackoverflow.com/a/17972089/1347784

InformationsquelleAutor Dreamcatcher | 2013-07-31
Schreibe einen Kommentar