Partager via


Verrouillage des curseurs

Dans MicrosoftSQL Server, l'instruction SELECT figurant dans une définition de curseur est soumise aux mêmes règles de verrouillage de transaction que celles qui s'appliquent aux autres instructions SELECT. Cependant, dans les curseurs, il est possible d'obtenir un autre jeu de verrous de défilement en fonction de la spécification du niveau de concurrence d'accès d'un curseur.

Les verrous de transaction obtenus par une instruction SELECT, y compris l'instruction SELECT figurant dans une définition de curseur, sont gérés par :

  • La valeur du niveau d'isolement d'une transaction pour la connexion.

  • Les indications de verrouillage spécifiées dans la clause FROM.

Ces verrous sont maintenus jusqu'à la fin de la transaction en cours, à la fois pour les curseurs et les instructions SELECT individuelles. Lorsque SQL Server fonctionne en mode auto-validation, chaque instruction SQL individuelle représente une transaction et les verrous sont libérés à la fin de l'exécution de l'instruction. Si SQL Server fonctionne en mode de transaction explicite ou implicite, les verrous sont maintenus jusqu'à ce que la transaction soit validée ou restaurée.

Le verrouillage réalisé pour ces deux exemples Transact-SQL est essentiellement le même :

/* Example 1 */
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
GO
BEGIN TRANSACTION
GO
SELECT * FROM AdventureWorks.Sales.Store;
GO

/* Example 2 */
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
GO
BEGIN TRANSACTION
GO
DECLARE abc CURSOR STATIC FOR
SELECT * FROM AdventureWorks.Sales.Store;
GO
OPEN abc
GO

Si vous spécifiez le mode lecture renouvelable pour le niveau d'isolement d'une transaction, l'instruction SELECT individuelle de l'exemple 1 et l'instruction SELECT contenue dans DECLARE CURSOR de l'exemple 2 génèrent toutes les deux des verrous partagés sur chaque ligne lue, et les verrous partagés sont maintenus jusqu'à ce que la transaction soit validée ou annulée.

Acquisition de verrous

Bien que les curseurs obéissent aux mêmes règles que celles régissant les instructions individuelles SELECT en ce qui concerne le type des verrous de transaction acquis, l'obtention des verrous a lieu à des moments différents. Les verrous générés par une instruction SELECT individuelle ou un curseur sont toujours obtenus au moment de l'extraction d'une ligne. Pour une instruction SELECT individuelle, toutes les lignes sont extraites au moment de l'exécution de l'instruction. Cependant, en fonction de leur type, les curseurs extraient les lignes à des moments différents :

  • Les curseurs statiques récupèrent la totalité du jeu de résultats au moment de leur ouverture. Ceci verrouille chaque ligne du jeu de résultats au moment de l'ouverture.

  • Les curseurs pilotés par jeu de clé extraient les clés de chaque ligne du jeu de résultats au moment de leur ouverture. Ceci verrouille chaque ligne du jeu de résultats au moment de l'ouverture.

  • Les curseurs dynamiques (y compris les curseurs de type avant uniquement) ne récupèrent pas les lignes tant qu'elles n'ont pas été extraites. Les verrous ne sont pas placés sur les lignes tant que celles-ci n'ont pas été extraites.

  • Les curseurs rapides de type avant uniquement varient dans la manière dont ils acquièrent leurs verrous, en fonction du plan d'exécution choisi par l'optimiseur de requête. Si un plan dynamique est choisi, aucun verrou n'est posé tant que les lignes ne sont pas extraites. Si des tables de travail sont générées, les lignes sont lues dans la table de travail, puis verrouillées lors de l'ouverture.

Les curseurs prennent également en charge leurs propres spécifications de concurrence d'accès, certains d'entre eux génèrent également des verrous supplémentaires sur les lignes récupérées lors de chaque extraction. Ces verrous de défilement sont maintenus jusqu'à l'extraction suivante ou la fermeture du curseur, selon l'opération qui se produit en premier. En cas d'activation de l'option de connexion spécifiant le maintien de l'ouverture des curseurs lors d'une validation, ces verrous seront maintenus pendant une opération de validation ou d'annulation.