82 votes

Forcer un délai d'attente pour les requêtes dans SQL Server

Nous avons rencontré un problème avec un bloc de code qui réagit mal face à des bases de données lentes (il s'effondre lors d'un dépassement de délai de requête). Nous avons créé un correctif et nous sommes en train de le soumettre à la régression.

Nous n'arrivons pas à obtenir un temps mort. J'ai ouvert une transaction à partir de SQL Mgmt Studio et j'ai mis à jour chaque ligne pour les verrouiller, mais cela ne provoque pas de dépassement de délai pour les INSERT (ce dont j'ai besoin).

Puis-je obtenir facilement un verrou au niveau de la table via T-SQL ? Ou est-ce que je dois jouer avec le maître ? Ou puis-je facilement forcer le délai d'attente sans verrouiller ? Tout commentaire est le bienvenu.

135voto

KM. Points 51800

Exécutez ceci et essayez ensuite votre insert...

select * from yourTable with (holdlock,tablockx)

ici, vous pouvez le verrouiller pendant 5 minutes :

BEGIN TRANSACTION

SELECT * FROM yourTable WITH (TABLOCKX, HOLDLOCK)

WHERE 0 = 1

WAITFOR DELAY '00:05'

ROLLBACK TRANSACTION

0 votes

Existe-t-il un moyen de faire cela à partir de C#/.NET sans bloquer le thread qui a fait cet appel au serveur SQL ? J'essaie de tester le comportement de mon application lorsque l'acquisition de la connexion est interrompue. Mais si j'appelle ce code à partir de C#, je ne sais pas comment exécuter une autre requête, en subissant délibérément le délai d'attente.

0 votes

Je suppose que nous ne le saurons jamais...

34voto

David Points 20209

Vous pouvez simplement demander à votre code SQL d'attendre une minute avant de revenir :

WaitFor Delay '00:01:00'

0 votes

J'ai voté pour la simplicité de la réponse. Je l'ai testée et elle fonctionne

0 votes

Je remplissais une table et créais des requêtes récursives complexes, des tampons, des absurdités. Ceux-ci font l'affaire.

10voto

Precipitous Points 1891

En revanche, si la connexion est configurable, réduisez le délai d'attente de la chaîne de connexion à 1 seconde - cela facilitera les choses. Remplissez la table avec des tonnes de données et faites tourner 3 autres processus en boucle pour mettre à jour des morceaux de cette table avec une transaction autour de la boucle. Ne pas modifier la procédure appelée par l'application (injecter waitfor). Cela invalide un test d'intégration.

Mais en réalité, il s'agit d'une étude de cas en faveur des tests unitaires et de l'injection de dépendances. Certaines choses sont tout simplement difficiles à tester au niveau de l'intégration. Test unitaire + l'injection de dépendance .

  • Réel : Code qui foire -> Délai d'attente de la base de données (difficile à reproduire).
  • Refactoriser : Code qui ne fonctionne pas -> Référentiel (accès aux données uniquement) -> Base de données
  • Test unitaire : Le code qui craint > Dépôt fictif à lancer -> null
  • Vous avez maintenant un test qui échoue pour un code qui ne fonctionne pas et vous pouvez le corriger.

Il s'agit de l'injection de "dépendance". Le développeur peut injecter la dépendance dans la base de données, en remplaçant quelque chose qui simule le comportement d'une dépendance. C'est une bonne chose à faire pour tous les tests de base de données. Quoi qu'il en soit, avec le test unitaire en place, vous savez que le correctif fait en quelque sorte ce qu'il doit faire, mais vous avez toujours besoin d'un test d'intégration. Dans ce cas, il est préférable de se concentrer sur la régression, c'est-à-dire de vérifier que la correction n'a rien cassé d'autre et que la fonctionnalité fonctionne toujours.

Vous avez déjà créé votre patch, donc je pense que ma réponse arrive trop tard.

6voto

DL Redden Points 333

Consultez cet article de blog. En principe, SQL Server ne dispose pas de délais d'attente pour les requêtes. Les clients peuvent imposer un délai d'attente pour les requêtes SQL, mais le moteur lui-même ne le fait pas.

http://blogs.msdn.com/khen1234/archive/2005/10/20/483015.aspx

0 votes

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X