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?

Était-ce utile?

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

De la doco :

  

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

Voir   - Contrôle de SQL Server avec verrouillage et Conseils

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top