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.

InformationsquelleAutor Phil Wright | 2012-10-27
Schreibe einen Kommentar