2010-08-24 4 views
0

J'ai reçu une exception de délai d'attente de requête linq. Après un peu de recherche en ligne, en utilisant TransactionScope pour que 'nolock' obtienne mon vote. Cependant, après avoir utilisé le code ci-dessous, je reçois toujours le même délai d'exception. Toute aide est évaluée, merci d'avance.Problème de verrouillage de requête linq (linq to sql)

IEnumerable<IGrouping<string, Log>> grps = logs.GroupBy(l => l.msg_shortdesc); 
using (var t = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted })) 
{ 
    var lst = grps.ToList(); 
} 

Répondre

1

Vous avez la bonne stratégie et les déclarations avec TransactionOptions et IsolationLevel.ReadUncommitted pour aider à utiliser NOLOCK dans vos instructions SQL. Hanselman suggests it!

La question se pose de savoir si les instructions SQL générées par LINQ To SQL sont performantes dans la base de données. Rappelez-vous que Dev vs Test vs Prod fonctionnera différemment, en fonction du nombre de lignes dans votre table, et les types de données dans votre requête.

Quelques choses à vérifier:

  • Quelle est l'instruction SQL étant envoyée au serveur? Vérifiez avec SQL Profiler. Ce SQL s'exécute-t-il rapidement dans une requête ad hoc via SSMS?

  • Y a-t-il un index sur la colonne msg_shortdesc? Ajoutez un nouvel index, s'il n'en existe pas, sur cette table pour cette colonne. Réexécutez votre requête LINQ To SQL pour vérifier ses performances.

Il semble que vous n'ayez pas la possibilité de modifier la configuration de la base de données (index). Suggérez que sans la possibilité d'apporter des modifications à la configuration, vous ne serez pas en mesure de faire les modifications nécessaires pour améliorer les performances. Vous serez malheureusement constamment au gré du hasard de la charge générée par les autres utilisateurs.

Si vous ne pouvez absolument pas créer d'index, envisagez une stratégie de mise en cache sur cet ensemble de données. Peut-être charger ces données dans Session et expirer chaque n minutes.

+0

Salut Campbell, merci pour votre réponse rapide. Je ne pense pas que msg_shortdesc a un index – Zalan

+0

Il devrait renvoyer plus de 1000 enregistrements. Je suis conscient qu'il existe un problème de blocage dû aux requêtes simultanées, c'est la raison pour laquelle j'utilise TransactionScope. Le msg_shortdesc est varchar – Zalan

+0

@zalan: le nouvel index at-il amélioré les performances? –