Partager via


Personnalisation du délai d'attente de verrouillage

Lorsqu'une instance du Moteur de base de données SQL ServerMicrosoft ne peut pas accorder un verrou à une transaction car une autre transaction possède déjà un verrou en conflit sur la ressource, la première transaction se bloque, dans l'attente de la libération du verrou existant. Par défaut, il n'existe pas de délai d'expiration obligatoire et aucun moyen de tester si une ressource est déjà verrouillée avant de la verrouiller, excepté par une tentative d'accès aux données (avec un risque de blocage infini).

[!REMARQUE]

Dans SQL Server, utilisez la vue de gestion dynamique sys.dm_os_waiting_tasks pour déterminer si un processus est bloqué et l'auteur du blocage. Dans les versions antérieures de SQL Server, utilisez la procédure stockée système sp_who.

Le paramètre LOCK_TIMEOUT permet à une application de définir la durée maximale pendant laquelle une instruction reste en attente sur une ressource bloquée. Si l'attente d'une instruction dépasse la valeur du paramètre LOCK_TIMEOUT, l'instruction bloquée est automatiquement annulée, et le message d'erreur 1222 (Lock request time-out period exceeded) retourné à l'application. Toute transaction contenant la commande n'est toutefois pas restaurée ou annulée par SQL Server. L'application doit donc posséder un gestionnaire d'erreurs capable d'intercepter le message d'erreur 1222. Si une application ne gère pas cette erreur, elle peut continuer en ignorant que l'une des instructions de la transaction a été annulée. Des erreurs peuvent se produire lorsque les instructions ultérieures dans la transaction dépendent de l'instruction qui n'a jamais été exécutée.

L'implémentation d'un gestionnaire d'erreurs qui intercepte le message d'erreur 1222 permet à une application de prendre les mesures conséquentes au délai d'expiration, par exemple soumettre à nouveau l'instruction qui été bloquée ou restaurer toute la transaction.

Pour déterminer la valeur actuelle du paramètre LOCK_TIMEOUT, exécutez la fonction @@LOCK_TIMEOUT :

SELECT @@lock_timeout;
GO