CORRECTIF : Les verrous d’une table ne sont pas transmis lors de l’insertion de lignes dans une table dans SQL Server 2008 ou dans SQL Server 2008 R2

S’applique à : Microsoft SQL Server 2008 Service Pack 4Microsoft SQL Server 2008 R2 Service Pack 3

Symptômes


Prenons l’exemple du scénario suivant :
  • Vous insérez le nombre de lignes dans une table dans Microsoft SQL Server 2008 ou dans SQL Server 2008 R2 à l’aide d’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
    • L’espace réservé < target_table > représente le nom de la table cible réelle.
    • L’espace réservé < prédicat > représente le prédicat réel.
    • L’espace réservé < table_source > représente la table de la source réelle.
  • Dépassement du seuil d’escalade de verrou de la table.
Dans ce scénario, le moteur de base de données ne pas réaffecter les verrous de la table.

Cause


Ce problème se produit car SQL Server ne compte pas en interne tous les nouveaux verrous générés par les opérations d’insertion. Par conséquent, le seuil de majoration de verrou ne peut pas déclenché lorsqu’il est requis.

Résolution


Informations de service pack pour SQL Server 2008

Pour résoudre ce problème, procurez-vous le dernier service pack pour SQL Server 2008.For plus d’informations, cliquez sur le numéro ci-dessous pour afficher l’article correspondant dans la Base de connaissances Microsoft :
968382 Comment faire pour obtenir le dernier service pack pour SQL Server 2008

Informations de 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 afficher l'article correspondant dans la Base de connaissances Microsoft :
2527041Comment faire pour obtenir le 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é dans SQL Server 2008 Service Pack 2 pour SQL Server 2008.This 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 les verrous, reportez-vous au site Web de Microsoft TechNet suivant :Pour déterminer si les verrous d’une table sont transmis, 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 verrous de la table sont transmis, la dernière instruction SELECT renvoie une valeur de 1 ou 2. Si les verrous de la table ne sont pas transmis, la dernière instruction SELECT renvoie une valeur de 40,066 ou de 40,067.