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

Leave a Reply

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *