Délai d'expiration du verrouillage
Quand Microsoft SQL Server Compact 3.5 ne peut pas accorder un verrou à une transaction sur une ressource parce qu'une autre transaction détient déjà un verrou en conflit sur cette ressource, la transaction demandant le verrou est bloquée jusqu'à ce que l'autre transaction libère le verrou. Cette situation peut aussi résulter d'un blocage. SQL Server Compact 3.5 a un délai d'attente de verrouillage par défaut de deux secondes. Il n'existe pas de moyen de tester si une ressource est verrouillée avant de la verrouiller, si ce n'est tenter d'accéder aux données et devoir éventuellement dépasser le délai d'expiration.
Notes
Vous pouvez utiliser la vue système sys.lock_information pour déterminer si une requête de verrouillage est bloquée et ce qui la bloque. Pour plus d'informations, consultez Affichage des informations de verrouillage.
Le paramètre LOCK_TIMEOUT permet à une application de définir une durée maximale d'attente d'une ressource bloquée pour une instruction. Quand une instruction a attendu plus longtemps que la durée indiquée par le paramètre LOCK_TIMEOUT, l'instruction bloquée est automatiquement annulée, et le message d'erreur SSCE_M_LOCKTIMEOUT, « Le système a dépassé le délai d'attente pour l'obtention d'un verrou », est renvoyé à l'application. Cependant, SQL Server Compact 3.5 n'annule pas les transactions contenant l'instruction. L'application doit comporter un gestionnaire d'erreurs qui peut intercepter le message d'erreur SSCE_M_LOCKTIMEOUT. Si une application n'intercepte pas l'erreur, elle peut traiter les informations sans savoir qu'une instruction particulière au sein d'une transaction a été annulée. Des erreurs peuvent alors se produire parce que des instructions qui la suivent dans la transaction peuvent dépendre de l'instruction qui n'a pas été exécutée.
L'implémentation d'un gestionnaire d'erreurs qui intercepte le message d'erreur SSCE_M_LOCKTIMEOUT permet à une application de gérer la situation de dépassement de délai et de réaliser les actions nécessaires pour y remédier, comme renvoyer automatiquement l'instruction qui a été bloquée ou d'annuler la totalité de la transaction.
Pour définir le paramètre LOCK_TIMEOUT pour une session, exécutez la commande SET LOCK_TIMEOUT comme indiqué dans l'exemple de code suivant :
SET LOCK_TIMEOUT 2000;