Comment changer la stratégie de locking dans SQL Server?

J'ai lu des articles comme ceux-ci: http://www.codinghorror.com/blog/archives/001166.html http://www.databasejournal.com/features/mssql/article.php/3566746/Controlling-Transactions-and -Locks-Part-5-SQL-2005-Snapshots.htm

Et d'après ce que je comprends, SQL Server a une stratégie de locking très pessimiste. Et pour améliorer les performances, je devrais changer le locking Read Committed Snapshot.

Mais je ne peux pas find où le faire. Où puis-je changer la stratégie de locking?

Vous pouvez lire sur Utilisation des niveaux d'isolement basés sur le versionnement de la ligne avec des exemples sur la façon de les définir à l'aide de la command ALTER.

Il est défini au niveau de la database comme suit:

ALTER DATABASE YourDatabaseName SET READ_COMMITTED_SNAPSHOT ON; 

Le parent de la documentation ci-dessus, qui couvre les rubriques connexes, constitue un meilleur sharepoint départ: Niveaux d'isolation basés sur les versions de lignes dans le moteur de database .

EDIT: liens ajoutés mentionnés dans mes commentaires ci-dessous.

  • USERCCTIONS DBCC – détermine le niveau d'isolation actuel
  • Contrôle des transactions et des verrous Partie 5: Snapshots SQL 2005 – explique l'instantané de lecture lu et le niveau d'isolement.

L'utilisation du niveau d'isolement SNAPSHOT ajoute beaucoup de charge au tempdb lorsque la charge de la database augmente.

Il est préférable de modifier les methods de locking via des indications de locking dans les requêtes ou en modifiant le niveau ISOLATION LEVEL en général pour la procédure stockée ou la connection. Cela est effectué avec la command SET ISOLATION LEVEL ou en modifiant le niveau d'isolation de l'object de connection dans .NET.

Si vous souhaitez que SQL Server gère son locking à un niveau autre que le niveau de page par défaut (par exemple, le locking au niveau de la ligne) qui doit être géré sur une instruction par niveau d'instruction en utilisant l'indicateur WITH (ROWLOCK) dans vos instructions.

 UPDATE YourTable (WITH ROWLOCK) SET Col2 = 3 WHERE Col1 = 'test' 

Il n'y a pas de paramètre global pour changer ce niveau de locking, et si ROWLOCK est utilisé en combinaison avec le snapshot, les opérations au niveau niveau auront toujours lieu au niveau de la page car la page entière doit être copiée dans la database tempdb puis mise à jour. La version doit être supprimée de la database tempdb.

Vous pouvez définir le niveau d'isolation du verrou lorsque vous configurez la connection à la database, en appelant

 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

Là où je travaille, nous faisons cela pour chaque connection que nous établissons, ils sont tous installés au même endroit que nous utilisons un pool de connections partagées pour accéder à la database. L'option READ UNCOMMITTED s'applique ensuite à toutes les instructions émises par cette connection.