Comment prévenir EntityFramework de blocage lors de l'exécution simultanée de ces deux états

Appelle dans mon service web à utiliser le code suivant pour s'assurer que l'appelant a une session valide. Si une session valide, alors il se met à jour la session de détails et enregistre les modifications. Tous assez simple et fonctionne très bien.

//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;
     }    
}

Tout fonctionne bien jusqu'à ce que le même correspondant, et donc de la même session, fait plusieurs appels simultanés (ce qui est parfaitement valable d'arriver). Dans ce cas, parfois, j'ai un blocage. À l'aide de SQL Server Profiler, je peux voir la suite se passe.

Appelant Un effectue la sélection et acquiert un verrou partagé sur la session de l'utilisateur. Appelant B effectue la sélection et acquiert un verrou partagé sur la même session de l'utilisateur. L'appelant A ne peut pas effectuer sa mise à jour en raison de l'Appelant B du verrou partagé. Appelant B ne peut pas effectuer sa mise à jour en raison de l'appelant est Un verrou partagé. L'impasse.

Cela semble simple et classique de blocage et il doit y avoir une méthode simple pour résoudre le problème. Sûrement presque toutes les applications du monde réel ont ce même problème.Mais aucun de l'Entité Cadres de livres que j'ai mentionne rien au sujet des blocages.

OriginalL'auteur Phil Wright | 2012-10-27