web-dev-qa-db-fra.com

Forcer un délai d'expiration de requête dans SQL Server

Nous avons eu un problème avec un bloc de code qui répond mal face à des bases de données lentes (il craque le lit sur un timeout de requête). Nous avons créé un correctif et sommes en train de l'exécuter par régression.

Nous ne pouvons pas obtenir de délai d'attente. J'ai ouvert une transaction depuis SQL Mgmt Studio et mis à jour chaque ligne pour les verrouiller, mais cela n'entraîne pas l'expiration des INSERT (ce dont j'ai besoin).

Puis-je obtenir facilement un verrou au niveau de la table via T-SQL? Ou dois-je jouer avec le maître? Ou puis-je facilement forcer le délai sans verrouillage? Toute contribution est appréciée.

75
BnWasteland

exécutez ceci et essayez 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
122
KM.

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

WaitFor Delay '00:01:00'
28
David

Côté astuce: si la connexion est configurable, réduisez le délai d'expiration de la chaîne de connexion à 1 seconde, ce qui facilitera la tâche. Remplissez la table avec des tonnes de données et faites tourner 3 autres processus dans une boucle mettant à jour des morceaux de cette table avec une transaction autour de la boucle. Ne modifiez pas la procédure réelle appelée par l'application (injection de 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épendance. Certaines choses sont difficiles à tester. Test unitaire + injection de dépendance .

  • Réel: Code qui craps -> Délai d'expiration de la base de données (difficile à reproduire).
  • Refactor: Code qui craps -> Référentiel (accès aux données uniquement) -> Base de données
  • Test unitaire: code qui craps> dépôt fictif à lancer -> null
  • Vous avez maintenant un test qui échoue pour le code qui craps et peut le corriger.

Il s'agit d'une 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. Bon à 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 ce qu'il devrait, mais vous avez toujours 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 cassé d'autre et que la fonctionnalité fonctionne toujours.

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

9
Precipitous

Consultez cet article de blog. Fondamentalement, SQL Server n'a pas de délais d'expiration de requête. Les clients peuvent appliquer un délai d'expiration SQL, mais pas le moteur lui-même.

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

5
DL Redden