Est-il possible de définir l'indicateur de table ROWLOCK à partir d'un niveau d'isolation de transaction dans MSSQL?

J'écris un wrapper pour un pilote MSSQL et on m'a dit que nous devons nous assurer que chaque requête UPDATE ou DELETE entrante contient l'indicateur de table ROWLOCK. Ce serait fantastique si je pouvais le faire au niveau de l'isolation d'une transaction plutôt que d'une regex whackjob de chaque requête existante à inclure WITH ROWLOCK. Maintenant, je suis soit SOL ou juste très confus quant à ce que fait réellement ROWLOCK, alors s'il vous plaît faites le moi savoir si ma compréhension est imparfaite.

Je crois que ce que j'essaye d'accomplir est de s'assurer que toutes les lignes touchées par une instruction UPDATE ou DELETE restront non seulement cohérentes avec les changements provoqués par ma transaction et ma transaction seule pendant toute sa durée, mais surtout éviteront que les lignes affectées soient touchées par toute autre transaction concurremment.

Les niveaux d'isolation disponibles sont (à partir de https://msdn.microsoft.com/en-us/library/ms173763.aspx ):

-- Syntax for SQL Server and Azure SQL Database SET TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SNAPSHOT | SERIALIZABLE } [ ; ] 

Il semble que READ COMMITED et REPEATABLE READ soient utiles pour empêcher que datatables que je touche soient affectées par des changements externes dans la scope de ma transaction. Cependant, si j'interprète correctement le sharepoint ROWLOCK, je ne veux pas seulement préserver l'état des données dans mon champ d'application, je veux empêcher quiconque de toucher aux données dont je traite sous quelque forme que ce soit jusqu'à ce que je suis complètement emballé et ma transaction est engagée.

Je suis convaincu et j'espère que le problème ici est de mal comprendre ce qu'est le but de ROWLOCK. Alors permettez-moi de reformuler, la tâche consiste à inclure l'indicateur de table ROWLOCK dans chaque instruction UPDATE ou DELETE, mais à partir d'un niveau d'isolation de transaction. J'utilise le pilote Tedious Node.js, bien que je ne pense pas que ce soit pertinent pour cette question.

Si je comprends bien votre question, il semble que vous cherchez SNOLSHOT ISOLATION. Il ne fait pas de verrous de ligne mais utilise le versionnage de ligne. Selon votre question, il semble que vous ne voulez pas de verrous sur "Lire" en raison de la performance, mais que vous voulez conserver l'intégrité pour les opérations d'écriture.

Le niveau d'isolation de cliché utilise la gestion des versions de ligne pour fournir une cohérence de lecture au niveau de la transaction. Les opérations de lecture n'acquièrent aucun verrou de page ou de ligne, mais effectuent des versions de lignes avec des instructions DML.

Comme avec (rowlock) est un indice qui indique à la database qu'il doit conserver les verrous sur une scope de ligne. Cela signifie que la database évite l'escalade des verrous pour bloquer ou définir la scope. Cela permettra à une autre requête de lire des lignes non liées en même time au lieu de devoir attendre la fin de la suppression.

L'utilisation de rowlock mentionnée ci-dessus peut être réalisée en utilisant SNAPSHOT ISOLATION où vous pourrez lire des lignes non liées.