59 votes

Est-il possible de forcer le verrouillage au niveau des lignes dans SQL Server ?

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 ?

36voto

Sam Saffron Points 56236

Vous pouvez utiliser l'indication ROWLOCK, mais, selon les informations disponibles, SQL peut décider de l'escalader s'il manque de ressources.

Extrait du documentaire :

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.

15voto

Remus Rusanu Points 159382

Utilisez la clause ALLOW_PAGE_LOCKS de l'option MODIFIER/CRÉER UN INDEX :

ALTER INDEX indexname ON tablename SET (ALLOW_PAGE_LOCKS = OFF);

8voto

mdma Points 33973

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X