Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

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

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

De la documentation :

ROWLOCK Spécifie que des verrous de ligne sont posés lorsque des verrous de page ou de table sont habituellement posés. Lorsqu'ils sont spécifiés dans des transactions fonctionnant au niveau d'isolation SNAPSHOT, les verrous de ligne ne sont pas pris à moins que ROWLOCK ne soit combiné avec d'autres indicateurs de table nécessitant des verrous, tels que UPDLOCK et HOLDLOCK.

et

Les indicateurs 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 clusterisé et qu'une instruction SELECT utilisant un indicateur 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 dans la table de base.

Et enfin, cela donne une explication assez détaillée 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 aller, 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.