web-dev-qa-db-fra.com

Qu'est-ce que l'escalade des verrous?

On m'a posé cette question lors d'une entrevue et je n'ai eu aucune réponse. Quelqu'un peut-il expliquer ici?

49
Kilhoffer

Les verrous de base de données peuvent exister sur des lignes, des pages ou des tables entières ou des index. Lorsqu'une transaction est en cours, les verrous détenus par la transaction prennent des ressources. L'escalade de verrous est l'endroit où le système consolide plusieurs verrous en un niveau supérieur (par exemple, la consolidation de plusieurs verrous de ligne sur une page ou plusieurs pages dans une table entière) généralement pour récupérer les ressources occupées par un grand nombre de verrous à grain fin.

Il le fera automatiquement, bien que vous puissiez définir des indicateurs sur les tables (voir ALTER TABLE dans les livres en ligne) pour contrôler la politique d'escalade des verrous sur cette table particulière. En particulier, l'escalade de verrous prématurée ou trop pressante était un problème sur les anciennes versions de Sybase et de SQL Server lorsque deux processus écrivaient simultanément des lignes distinctes sur la même page. Si vous remontez assez loin (IIRC SQL Server 6.5), SQL Server n'avait pas de verrouillage de ligne, mais ne pouvait verrouiller que des tables ou des pages. Lorsque cela s'est produit, vous pouvez obtenir des conflits entre les insertions d'enregistrements sur la même page; souvent, vous mettiez un index clusterisé sur la table afin que les nouvelles insertions soient envoyées à différentes pages.

C'est une méthode pour réduire les frais généraux du système, en convertissant de nombreux verrous à grains fins en moins de verrous à gros grains. Des informations plus détaillées peuvent être trouvées ici et ici .

Par exemple, si vous avez plusieurs verrous (généralement des centaines ou plus) sur des lignes spécifiques dans une table, une fois que vous avez dépassé votre nombre maximum de verrous autorisés, ceux-ci peuvent être échangés contre un verrou sur la table entière.

21
Bill the Lizard

SQL Server ne verrouille l'escalade afin de réduire la surcharge de mémoire , en convertissant plusieurs écluses de bas niveau à grains fins à écluses de haut niveau à gros grains.

  • Les verrous de ligne sont toujours convertis en verrous de table, et
  • Les verrous de page sont également convertis en verrous de table.

C'est un mythe que les verrous de ligne sont escaladés en verrous de page , comme mentionné ci-dessus par @ConcernedOfTunbridgeWells est faux.

Si une table a très peu de mises à jour de lignes, le moteur SQL essaiera de prendre des Row-Locks sur ces lignes ou Page-Lock sur ces pages. Disons qu'il a fallu Row-Lock. Mais si la mise à jour des lignes augmente le seuil (~ 5k verrous), au lieu de prendre plusieurs Row-Locks, il faut un seul Table-Lock. Ainsi, cela réduit la surcharge de mémoire en libérant plusieurs Row-Locks et en prenant un seul Table-Lock, mais augmente la simultanéité. La même chose se produit avec le verrouillage de la page.

Le seuil d'escalade des verrous est d'au moins 5000 verrous, et dépend de plusieurs facteurs, une explication détaillée de l'escalade des verrous a été mentionnée ici dans MSDN BoL: - https://technet.Microsoft.com/en-us/library/ms184286 (v = sql.105) .aspx

12
Manoj Pandey

L'escalade de verrous signifie la conversion d'un verrou en un mode plus restrictif. Cela se voit le plus souvent dans les bases de données. Une requête peut avoir une ressource verrouillée pour "partagée" et la faire passer à "exclusive" pour effectuer une mise à jour.

5
Richard T