Symptômes
Prenons l’exemple du scénario suivant :
-
Vous disposez d’une base de données qui contient les options ALLOW_SNAPSHOT_ISOLATION puis READ_COMMITTED_SNAPSHOT activée dans Microsoft SQL Server 2008 R2.
-
Il s’agit d’une instruction Select contenant des indications TABLOCK et UPDLOCK par rapport à une table dans la base de données.
-
L’instruction Select est encapsulée dans une instruction BEGIN TRANexplicite, mais Commit TRAN ne s’exécute pas.
-
Il existe deux autres requêtes qui commencent par les mêmes indicateurs de requête dans la transaction explicite.
Dans ce scénario, lorsque la première requête est validée, l’une des autres requêtes est Deadlock.
Cause
Ce problème survient parce que SQL Server signale incorrectement le blocage dans l’un des scénarios suivants :
-
Lorsque ALLOW_SNAPSHOT_ISOLATION et READ_COMMITTED_SNAPSHOT sont activés pour une base de données, plusieurs requêtes par rapport à la même transaction peuvent être signalées de manière incorrecte lorsque l’une d’elles se termine.
-
Lorsque la ALLOW_SNAPSHOT_ISOTION est activée et que les indicateurs TABLOCK et UPDLOCK sont utilisés, les deuxième et troisième instructions Select prennent des verrous IX avec l’intention de convertir en X. La prise d’effet de l’argument IX a pour effet d’arrêter le blocage lors de la tentative de conversion en X.
-
Lorsque ALLOW_SNAPSHOT_ISOLATION est désactivée, les deuxième et troisième requêtes obtiennent un verrou de six. Dans ce cas, lorsque le verrou SIX est converti en X, il s’agit juste d’un scénario de blocage et pas de blocage.
Résolution
Le problème a été résolu dans la mise à jour cumulative suivante de SQL Server. Après avoir appliqué le correctif, SQL Server a résolu le problème en enregistrant s’il s’agit d’une indication de validation de lecture ou d’une indication de l’option de verrouillage pour la base de données et la requête. Ces informations sont utilisées pour sélectionner le type correct de verrou pour gérer la situation correctement, au lieu de signaler incorrectement le blocage.
Mise à jour cumulative 11 pour SQL Server 2008 R2 SP2 /en-us/help/2926028
Chaque nouvelle mise à jour cumulative pour SQL Server contient tous les correctifs et les correctifs de sécurité inclus dans la mise à jour cumulative précédente. Consultez les dernières mises à jour cumulatives pour SQL Server :
Statut
Microsoft a confirmé l'existence de ce problème dans les produits Microsoft figurant dans la liste des produits concernés par cet article.