Indicateurs de verrouillage
Il est possible de spécifier des indicateurs de verrouillage pour des références de table individuelles dans les instructions SELECT, INSERT, UPDATE et DELETE. Ces indicateurs déterminent le type de verrouillage ou de versioning de ligne qu'utilise MicrosoftMoteur de base de données SQL Server pour les données de la table. Les indicateurs de verrouillage au niveau des tables peuvent être utilisés pour un contrôle plus fin des types de verrous acquis sur un objet. Ces options de verrouillage remplacent le niveau d'isolement courant de la transaction pour la session.
Pour plus d'informations sur les indicateurs de verrouillage spécifiques et leur fonctionnement, consultez Indicateurs de table (Transact-SQL).
[!REMARQUE]
L'optimiseur de requête du Moteur de base de données choisit presque toujours le niveau de verrouillage correct. Nous vous recommandons d'utiliser les indicateurs de verrouillage au niveau des tables à la place du verrouillage par défaut seulement lorsque cela est nécessaire. La désactivation d'un niveau de verrouillage peut affecter défavorablement la concurrence d'accès.
Il se peut que le Moteur de base de données doive obtenir des verrous lors de la lecture de métadonnées, même lors du traitement d'une sélection avec un indicateur de verrouillage qui empêche les demandes de verrous de partage lors de la lecture de données. Par exemple, une instruction SELECT qui utilise le verrou NOLOCK n'obtient pas de verrous de partage lors de la lecture de données, mais elle peut occasionnellement demander des verrous lorsqu'elle lit un affichage catalogue système. Cela signifie qu'il est possible qu'une instruction SELECT utilisant NOLOCK soit bloquée.
Comme l'illustre l'exemple suivant, si le niveau d'isolement d'une transaction est SERIALIZABLE et que l'indicateur de verrouillage NOLOCK au niveau des tables est utilisé avec l'instruction SELECT, les verrous de clé habituellement utilisés pour préserver des transactions sérialisables ne sont pas appliqués.
USE AdventureWorks;
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
GO
BEGIN TRANSACTION;
GO
SELECT Title
FROM HumanResources.Employee WITH (NOLOCK);
GO
-- Get information about the locks held by
-- the transaction.
SELECT
resource_type,
resource_subtype,
request_mode
FROM sys.dm_tran_locks
WHERE request_session_id = @@spid;
-- End the transaction.
ROLLBACK;
GO
Le seul verrou appliqué faisant référence à HumanResources.Employee est le verrou de stabilité de schéma (Sch-S). Dans ce cas, la possibilité de sérialisation n'est plus garantie.
Dans SQL Server 2008, l'option LOCK_ESCALATION de l'instruction ALTER TABLE peut défavoriser des verrous de table et activer des verrous HoBT sur des tables partitionnées. Cette option n'est pas un indicateur de verrouillage, mais elle peut servir à réduire l'escalade de verrous. Pour plus d'informations, consultez ALTER TABLE (Transact-SQL).