2009-04-28 7 views
65

Nous avons eu un problème avec un bloc de code qui réagit mal face aux bases de données lentes (il craps le lit lors d'un délai d'attente de requête). Nous avons créé un correctif et nous sommes en train de l'exécuter par régression.Forcer un délai d'attente de requête dans SQL Server

Nous ne pouvons pas obtenir un délai d'expiration. J'ai ouvert une transaction à partir de SQL Mgmt Studio et mis à jour chaque ligne pour les verrouiller, mais cela n'entraîne pas le délai d'attente des INSERTs (ce dont j'ai besoin). Puis-je obtenir facilement un verrou de table via T-SQL? Ou dois-je bricoler en maître? Ou puis-je forcer facilement le timeout sans verrouillage? Toute contribution est appréciée.

Répondre

102

Exécuter ce puis essayez votre insert ...

select * from yourTable with (holdlock,tablockx) 

ici, vous pouvez bloquer pendant 5 minutes:

BEGIN TRANSACTION 

SELECT * FROM yourTable WITH (TABLOCKX, HOLDLOCK) 

WHERE 0 = 1 

WAITFOR DELAY '00:05' 

ROLLBACK TRANSACTION 
19

Vous pouvez simplement dire à votre code sql attendre une minute avant de retourner:

WaitFor Delay '00:01:00' 
+0

Voté pour la simplicité de la réponse. Je l'ai testé et cela fonctionne – Mikel

+0

Je peuplais une table, et la création de requêtes récursives complexes, buff, non-sens. Ceux-ci font l'affaire. – DanielV

8

Du côté de la pointe: Si la connexion est configurable, réduire délai de chaîne de connexion à 1 seconde - qui le rendra plus facile. Remplissez la table avec des tas de données et faites tourner trois autres processus dans une boucle mettant à jour les morceaux de cette table avec une transaction autour de la boucle. Ne pas modifier la procédure réelle appelée par l'application (injection waitfor). Cela invalide un test d'intégration.

Mais en réalité, il s'agit d'une étude de cas en faveur du test unitaire et de l'injection de dépendances. Certaines choses sont difficiles à tester d'intégration. Test unitaire + dependency injection. Réel: Code qui craps -> Délai d'attente de la base de données (difficile à reproduire)

  • Refactor: Code qui craps -> Dépôt (ne fait que l'accès aux données) -> Base de données
  • test Unité: Code qui craps>Mock repository à jeter -> null
  • Maintenant vous avez un test à défaut de code craps et peut le réparer.

Ceci est une injection de "dépendance". Le dev peut injecter la dépendance à la base de données, en substituant quelque chose qui simule le comportement d'une dépendance. Bon à faire pour tous les tests de base de données. Quoi qu'il en soit, avec le test de l'unité en place, vous savez que le correctif est en quelque sorte ce qu'il devrait être, mais vous avez encore besoin d'un test d'intégration. Dans ce cas, il peut être préférable de se concentrer sur la régression, ce qui signifie que le test n'a rien brisé et que la fonction fonctionne toujours.

Vous avez déjà créé votre patch, donc je suppose que ma réponse est trop tardive.

Questions connexes