EF bloque l'access à la table de database

J'ai l'application web MVC4+EF+SQLServer . Il y a une table de Statistic avec la DateStamp(DateTime) . L'application web effectue le calcul (Where and Count) dans le tableau des Statistic à chaque request comme celle-ci

 public IQueryable<Statistic> GetStatisticForCurrentMonthByIp(ssortingng ip) { return _context.Statistic.Where(p => p.Ip == ip && SqlFunctions.DateDiff("mm", DateTime.UtcNow, p.DateStamp) == 0); } 

La méthode ci-dessus appelée comme ceci dans le controller

 var statList = _statisticService.GetStatisticForCurrentMonthByIp(queueItem.Ip).ToList(); 

Le problème est que parfois j'ai besoin de supprimer tous les loggings dans Statistic table de Statistic , mais l'application web verrouille la table de Statistic . Lorsque j'essaie d'exécuter SQL dans SQL Server, il se bloque.

 DELETE FROM Statistic 

Une idée de comment résoudre le problème?

ça gèle

Vous devez donc étudier le blocage dans SQL Server. Un outil simple est Activity Monitor . C'est un peu daté mais toujours utile: comprendre et résoudre les problèmes de blocage de SQL Server .

Ce que vous découvrirez est qu'il lit des écritures de bloc et écrit des lectures de bloc, probablement en raison de votre niveau d'isolation (voir en utilisant le nouveau TransactionScope () Considéré Nocif ).

L'utilisation de suppressions massives est très problématique en production et toujours une cause de blocage. Une meilleure alternative est TRUNCATE si vous voulez vraiment nuke le contenu. DELETE doit être utilisé en petites séries, non seulement pour éviter un blocage exhaustif, mais aussi pour ne pas causer d'indisponibilité massive du journal en raison de la croissance requirejse pour s'adapter à chaque ligne supprimée .

Une idée de comment résoudre le problème?

Examinez les niveaux d'isolement basés sur les versions de lignes dans le moteur de database . Assurez-vous de ne pas utiliser le new TransactionScope() .