Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Que sont les verrous de ligne, de page et de table ? Et quand sont-ils acquis ?

Verrouillage de ligne

Un verrou de ligne est le niveau de granularité de verrouillage le plus bas possible dans SQL Server. Cela signifie qu'une ou plusieurs lignes spécifiques seront verrouillées et que les lignes adjacentes sont toujours disponibles pour le verrouillage par des requêtes simultanées.

Verrouiller la page

Un verrou de page dans SQL Server verrouille 8K de données même lorsque votre requête n'a besoin que de 10 octets de la page. Ainsi, votre requête verrouillera des données supplémentaires que vous ne demandez pas dans votre requête.

Verrouillage Hobt

Lorsqu'une table est partitionnée avec le "partitionnement de table SQL Server", il est possible qu'une partition unique soit verrouillée (Hobt signifie Heap ou B-Tree)

Remarque : L'escalade des verrous vers les verrous HOBT est désactivée par défaut. exécutez ALTER TABLE MyTable SET (LOCK_ESCALATION = AUTO) pour activer l'escalade de verrouillage HOBT.

Verrouillage de table

Un verrou de tableau verrouille le tableau complet.

Que sont les pages de données

Microsoft SQL Server organise toutes ses données dans des "pages de données" qui peuvent contenir 8 000 données. Cela signifie que pour tout accès aux données dans SQL Server 8K, les informations seront lues.

Les pages de données ne peuvent contenir que des informations provenant d'un seul tableau et la mise en page d'une page est bien documentée sur MSDN

Le fait que SQL Server lira toujours une page de données complète vous donne également une idée de la raison pour laquelle il préfère utiliser des verrous au niveau de la page. L'implication des verrous au niveau de la page est que vous pourriez verrouiller beaucoup plus de données que vous ne le pensez.

Par exemple, supposons que nous ayons une table avec une taille d'enregistrement totale de 1024 octets avec un index clusterisé sur le champ ID . Lorsque nous exécutons la requête suivante :SELECT * from MyTable (xlock) where ID = 123 non seulement cet enregistrement sera verrouillé, mais (selon le remplissage de la page) un maximum de 3 enregistrements supplémentaires seront également verrouillés.

Quand ces verrous sont-ils acquis

Une requête sera analysée par le gestionnaire de requêtes et les verrous requis seront déterminés et demandés au gestionnaire de verrous. SQL Server essaiera de trouver un équilibre entre les performances et la contention pour déterminer la stratégie de verrouillage.

SQL Server suit également un système "d'escalade de verrous" qui réduira la granularité du verrouillage lorsque plus de 5000 verrous d'un certain type sont acquis. Consultez cet article sur l'escalade des verrous pour plus d'informations.

Ce comportement peut être modifié à l'aide d'astuces de verrouillage avec un accent sur les indices , dans une requête, vous pouvez spécifier par table le type de verrous que vous préférez. SQL Server essaiera d'honorer votre demande, mais il appliquera toujours l'escalade de verrous.