web-dev-qa-db-fra.com

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

Je peux voir comment désactiver le verrouillage de niveau ligne et de page dans SQL Server, mais je ne trouve pas de moyen de forcer SQL Server à utiliser le verrouillage de niveau ligne. Existe-t-il un moyen de forcer SQL Server à utiliser le verrouillage au niveau de la ligne et NON le verrouillage au niveau de la page?

54
Elan

Vous pouvez utiliser l'indicateur ROWLOCK, mais AFAIK SQL peut décider de l'intensifier s'il manque de ressources

Du doco :

ROWLOCK Spécifie que les verrous de ligne sont pris lorsque les verrous de page ou de table sont généralement pris. Lorsqu'ils sont spécifiés dans les transactions fonctionnant au niveau d'isolement SNAPSHOT, les verrous de ligne ne sont pas pris sauf si ROWLOCK est combiné avec d'autres indications de table qui nécessitent des verrous, tels que UPDLOCK et HOLDLOCK.

et

Les conseils de verrouillage ROWLOCK, UPDLOCK et XLOCK qui acquièrent des verrous au niveau des lignes peuvent placer des verrous sur les clés d'index plutôt que sur les lignes de données réelles. Par exemple, si une table a un index non cluster et qu'une instruction SELECT utilisant un indice de verrouillage est gérée par un index de couverture, un verrou est acquis sur la clé d'index dans l'index de couverture plutôt que sur la ligne de données de la table de base.

Et enfin cela donne une explication assez approfondie sur l'escalade de verrous dans SQL Server 2005 qui a été modifiée dans SQL Server 2008.

Il y a aussi, le 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

Cela devrait être correct, mais en fonction des index et de la charge sur le serveur, cela peut finir par dégénérer en un verrouillage de page.

32
Sam Saffron

Utilisez la clause ALLOW_PAGE_LOCKS de ALTER/CREATE INDEX :

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

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 astuces

8
mdma