Wie Sie verhindern, dass EntityFramework deadlock, wenn die gleichzeitige Ausführung dieser beiden Aussagen
Anrufe in meine web Dienst den folgenden code verwenden, um sicherzustellen, dass der Anrufer eine gültige session. Wenn eine gültige Sitzung gefunden, dann aktualisiert er die session-details und speichern Sie die änderungen. Alles ziemlich einfach und funktioniert gut.
//Create the Entity Framework context
using(MyContext ctx = CreateMyContext())
{
//Get the user session for the client session
UserSession session = (from us in context.UserSessions.Include("UserEntity")
where us.SessionId = callerSessionId
select us).FirstOrDefault<UserSession>();
if (session == null)
return false;
else
{
//Update session details
session.Calls++;
session.LastAccessed = DateTime.Now.Ticks;
Console.WriteLine("Call by User:{0}", session.UserEntity.Name);
//Save session changes back to the server
ctx.SaveChanges();
return true;
}
}
Alles Prima funktioniert, bis das gleiche Anrufer, und damit der gleichen Sitzung, mehrere Anrufe gleichzeitig (das ist durchaus gültig geschehen kann). In diesem Fall bekomme ich manchmal einen deadlock. Mithilfe von SQL Server Profiler kann ich finden Sie in der folgenden passiert.
Anrufer Einen führt die select-und die richtet eine gemeinsame Sperre auf der Benutzer-session. Anrufer B führt die select-und die richtet eine gemeinsame Sperre auf der gleichen Benutzer-session. Anrufer A kann nicht das update ausführen, weil der Anrufer B shared lock. Anrufer B nicht das update ausführen, weil der Anrufer Ein shared lock. Deadlock.
Dies scheint wie eine einfache und klassische deadlock-Szenario und es muss eine einfache Methode, es zu lösen. Sicherlich, fast alle real-world Anwendungen haben das gleiche problem.Aber keines der Entity Frameworks Bücher habe ich erwähnt, etwas über deadlocks.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich einen Artikel, dass die Gespräche über dieses HIER. Es ist im Grunde klingt wie starten und beenden Sie eine Transaktion, die Sie umgibt, Ihre EF-call... Der block gibt die folgende code-Beispiel also credit geht an Diego B Vega... Der blog-post auch links zu weiteren Blogs mit weiteren Informationen.
TransactionScope
innerhalb derMyContext
. In meinem Kopf nur daran denke...da die Transaktion verwendet wird für Rahmen...der Rahmen muss vorhanden sein, wenn die Transaktion abgeschlossen ist. Könnte hier falsch sein obwohl.Werden die folgenden arbeiten für Sie?
Vermutlich haben Sie jede Sitzung mit einer Transaktion vielleicht? in diesem Fall werden Sie von deadlock, da die Transaktionen, die beide versuchen, die Aktualisierung von shared lock exclusive lock, wenn Sie versuchen, zu speichern. Dies scheint nicht gut dokumentiert, da EF begünstigt die vollständige Parallelität.
Einen Weg aus dieser ist ein updatelock Tipp mit so etwas wie dieses:
finden Sie unter: entity framework 6 und pessimistische concurrency -