Est-il possible de forcer un verrouillage de ligne dans SQL Server?
-
29-09-2019 - |
Question
Je peux voir comment désactiver le niveau de ligne et niveau de la page de verrouillage dans SQL Server, mais je ne peux pas trouver un moyen de forcer SQL Server à utiliser le verrouillage de niveau ligne. Y at-il un moyen de forcer SQL Server à utiliser le verrouillage de niveau ligne et PAS utiliser le verrouillage du niveau de la page?
La solution
Vous pouvez utiliser l'astuce ROWLOCK, mais SQL AFAIK peut décider de dégénérer si elle est faible sur les ressources
rowlock Indique que les verrous de ligne sont prises lorsque les verrous de page ou de table sont habituellement pris. Lorsque cela est spécifié dans les opérations d'exploitation à SNAPSHOT niveau d'isolement, les verrous de ligne ne sont pas pris à moins ROWLOCK est combiné avec d'autres indicateurs de table qui nécessitent des serrures, tels que UPDLOCK et HOLDLOCK.
et
laisse deviner de verrouillage ROWLOCK, UPDLOCK ET XLOCK que des verrous de niveau ligne peuvent placer serrures sur les clés d'index plutôt que la des lignes de données réelles. Par exemple, si un table a un index non cluster, et instruction SELECT en utilisant une touche de verrouillage est manipulé par un index de recouvrement, un verrou est acquis sur la clé d'index dans la indice couvrant plutôt que sur les données ligne dans la table de base.
Et enfin cela donne une jolie explication approfondie au sujet de l'escalade de verrouillage dans SQL Server 2005 qui a été modifiée dans SQL Server 2008.
Il y a aussi, la très en profondeur: verrouillage dans le moteur de base de données (dans les livres en ligne)
Donc, en général
UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93
devrait être ok, mais en fonction des indices et de la charge sur le serveur, il peut finir par l'escalade à un verrou de page.
Autres conseils
Utilisez la clause ALLOW_PAGE_LOCKS de ALTER / CREATE INDEX :
ALTER INDEX indexname ON tablename SET (ALLOW_PAGE_LOCKS = OFF);
Vous ne pouvez pas vraiment forcer l'optimiseur à faire quoi que ce soit, mais vous pouvez le guider.
UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93