2010-01-06 5 views
0

Avoir un problème étrange. Je suis en train de tester une application ASP.NET que j'ai écrite qui interroge le serveur SQL via AJAX. L'application utilise LINQ-to-SQL pour charger les données d'environ 8 tables dans une jointure, et de temps en temps, l'appel au serveur SQL se bloque et ne revient jamais. Ma première pensée était qu'il était dans l'impasse, mais d'après ce que j'ai lu, SQL Server devrait choisir de tuer l'un des threads offensants si cela se produit. Dans le cas de cette application, il n'y a pas d'autres utilisateurs accédant à la base de données non plus, donc je ne vois pas comment cela pourrait être le problème.LINQ-to-SQL verrouille SQL Server pendant la requête?

Autres symptômes:

  1. L'utilisation du processeur sur les pointes de serveur à environ 40% lors de l'exécution de cet appel, et y reste, même après l'application est fermée (« stopped » dans Visual Studio).

  2. Le serveur continue d'exécuter l'appel jusqu'à ce que je vais effectivement tuer le serveur Web Visual Studio (Cassini) qui réside dans le bac. Lorsque l'on regarde ce que fait le serveur SQL, tout ce qu'on peut voir, c'est qu'il exécute l'appel LINQ-to-SQL, rien ne sort de l'ordinaire.

Quelqu'un at-il une idée de ce à quoi cela ressemble?

Merci, Sam

Répondre

1

Tout d'abord, mettez à jour votre serveur sql au dernier niveau de service pack. Vous pourriez vouloir regarder les mises à jour cumulatives qui ont été libérées depuis ce service pack et voir si n'importe quoi ressemble à votre problème particulier. Cela a peut-être été résolu. SQL Server choisira de supprimer l'un des éléments d'un verrou mort, mais cela dépend également des paramètres de délai d'expiration de la requête. Si votre délai d'attente est suffisamment élevé (300 secondes ...), SQL Server peut continuer à exécuter l'appel pendant un certain temps.

Si possible, vous pouvez utiliser NOLOCK sur vos tables dans l'appel sql de sorte qu'il s'agit d'un select non bloquant. Pour Linq-To-Sql, définissez le niveau d'isolation des transactions sur Read Uncommitted, c'est la même chose que NOLOCK.

Je mets encore une trace sur les appels LINQ to SQL, et les re courir dans sql profileur pour voir s'il y a quelque chose qui peut être accordé un peu mieux, comme de meilleurs indices, etc.

+0

Merci Chris - J'ai envisagé d'emprunter la route "NOLOCK", mais je l'ai gardé pour le pire. Je vais vérifier le service pack et les options de délai d'attente - c'est peut-être le cas. –

+0

Si les lectures sont correctes (et elles le sont habituellement), alors utiliser NOLOCK est une bonne idée. Par défaut, SQL Server sélectionne le bloc d'appels qui ajoute une surcharge et diminue les temps de réponse des requêtes. Dans des systèmes même modérément utilisés, le verrouillage par défaut peut avoir un impact négatif qui n'est généralement pas nécessaire. – NotMe

+0

Ok - Je vais vérifier. Je pense qu'il est peu probable que deux utilisateurs modifient les mêmes enregistrements en même temps dans ce système, car cela concerne la paie d'un travailleur et il n'y a qu'un seul responsable d'un travailleur. Merci beaucoup! –

0

J'ai vu un comportement similaire dans linq si une transaction commence, mais ne se termine jamais.