Je vois comment désactiver le verrouillage au niveau des lignes et des pages dans SQL Server, mais je ne trouve pas de moyen de forcer SQL Server à utiliser le verrouillage au niveau des lignes. Existe-t-il un moyen de forcer SQL Server à utiliser le verrouillage au niveau des lignes et à NE PAS utiliser le verrouillage au niveau des pages ?
Réponses
Trop de publicités?Vous pouvez utiliser l'indication ROWLOCK, mais, selon les informations disponibles, SQL peut décider de l'escalader s'il manque de ressources.
ROWLOCK Spécifie que les verrous de rangée sont sont pris lorsque les verrous de page ou de table sont sont normalement pris. Lorsqu'il est spécifié dans transactions fonctionnant au niveau d'isolation SNAPSHOT d'isolation, les verrous de ligne ne sont ne sont pas pris, sauf si ROWLOCK est combiné avec d'autres indications de table qui nécessitent des verrous comme UPDLOCK et HOLDLOCK.
et
Conseils de verrouillage ROWLOCK, UPDLOCK, ET XLOCK qui acquièrent des verrous de niveau ligne peuvent placer sur les clés d'index plutôt que sur les lignes de données réelles. Par exemple, si une table possède un index non groupé, et qu'une instruction une instruction SELECT utilisant un indice de verrouillage est est traitée par un index de recouvrement, un verrou est acquis sur la clé d'index dans l'index l'index de recouvrement plutôt que sur la ligne dans la table de base.
Et enfin Ce document donne une explication assez approfondie de l'escalade des verrous dans SQL Server 2005, qui a été modifiée dans SQL Server 2008.
Il y a aussi, le très approfondi : 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
Cela devrait aller, mais en fonction des index et de la charge du serveur, cela peut aboutir à un blocage de page.
Utilisez la clause ALLOW_PAGE_LOCKS de l'option MODIFIER/CRÉER UN 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ôler le serveur SQL avec le verrouillage et les astuces