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
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé un article qui parle de cette ICI. Essentiellement, il semble que vous pouvez démarrer et arrêter une transaction qui entoure votre EF appel... Le bloc donne l'exemple de code suivant donc le crédit va à Diego B Vega... Le blog également des liens vers un autre blog avec des informations supplémentaires.
Je crois que vous voulez le
TransactionScope
être à l'intérieur de laMyContext
. Dans mon esprit, juste à y penser...puisque la Transaction est utilisé pour le Contexte...le Contexte doit exister lorsque la Transaction se termine. Peut-être tort ici.OriginalL'auteur Jared
Aura les travaux suivants pour vous?
OriginalL'auteur user2337812