Symptômes
Prenons l’exemple du scénario suivant :
-
Vous insérez de nombreuses lignes dans une table dans Microsoft SQL Server 2008 ou dans SQL Server 2008 R2 en utilisant l’une des requêtes suivantes :
-
INSERT INTO <target_table> SELECT * FROM <target_table> WHERE <predicate>
-
SELECT * INTO <target_table> FROM <source_table> WHERE <predicate>
Remarques
-
Le <target_table espace réservé>représente le nom réel de la table cible.
-
Le prédicat<> espace réservé représente le prédicat réel.
-
Le <source_table espace réservé>représente la table source réelle.
-
-
Le seuil d’escalade du verrou du tableau est dépassé.
Dans ce scénario, le moteur de base de données ne transfère pas les verrous de la table.
Cause
Ce problème survient parce que SQL Server ne compte pas en interne tous les nouveaux verrous générés par les opérations d’insertion. C’est pourquoi le seuil d’escalade de verrou peut ne pas être déclenché quand il est requis.
Résolution
Informations sur le Service Pack pour SQL Server 2008
Pour résoudre ce problème, procurez-vous le dernier Service Pack pour SQL Server 2008. pour plus d’informations, cliquez sur le numéro ci-dessous pour consulter l’article de la base de connaissances Microsoft :
968382 Obtention du dernier Service Pack pour SQL Server 2008
Informations sur le Service Pack pour SQL Server 2008 R2
Pour résoudre ce problème, procurez-vous le dernier Service Pack pour SQL Server 2008 R2. Pour plus d’informations, cliquez sur le numéro ci-dessous pour consulter l’article de la base de connaissances Microsoft :
2527041Obtention du dernier Service Pack pour SQL Server 2008 R2
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.Ce problème a été corrigé pour la première fois dans SQL Server 2008 Service Pack 2 pour SQL Server 2008. ce problème a été corrigé dans SQL Server 2008 R2 Service Pack 1 pour SQL Server 2008 R2.
Informations supplémentaires
Pour plus d’informations sur la réaffectation de verrou, visitez le site Web Microsoft TechNet suivant :
Informations générales sur l’escalade du verrouPour déterminer si les verrouillages d’une table sont transférés, exécutez les instructions Transact-SQL suivantes :
USE tempdbGOCREATE TABLE x (i INT NOT NULL PRIMARY KEY)GOBEGIN TRANINSERT xSELECT TOP (40000)ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rFROM master..spt_values a, master..spt_values bORDER BYrSELECTCOUNT(*)FROM sys.dm_tran_locksWHERE request_session_id = @@SPID ROLLBACKGODROP TABLE x
Si les verrouillages de la table sont transférés, la dernière instruction SELECT renvoie une valeur de 1 ou 2. Si les verrouillages de la table ne sont pas escaladés, la dernière instruction SELECT renvoie une valeur de 40 066 ou 40 067.