Question

J'ai une longue transaction en cours d'exécution (appelée, par exemple, T1) qui effectue des mises à jour et suppressions, insertions sur une table dans SQL Server 2008 R2. En même temps, un autre processus exécute périodiquement des instructions select de ce tableau.

Dans les paramètres d'isolement par défaut (READ COMMITTED je pense?), Des blocs T1 des instructions select de l'exécution jusqu'à ce que les commits de transaction ou est annulée.

Ce que je voudrais voir est pour les instructions de sélection de fonction sur des données cohérentes même si la transaction est en cours. Je crois que l'isolement SNAPSHOT peut aider, mais ne sais pas si je vais dans la bonne direction. Serait-ce le meilleur niveau d'isolation pour cette application?

En second lieu, je n'ai aucun contrôle sur le processus qui appelle les instructions select, mais j'ai le contrôle de l'application .NET qui appelle T1. Est-ce que tout changement de niveau d'isolement nécessaires sur les deux instructions select et T1, ou serait-il suffisant pour marquer juste T1 comme ayant un niveau d'isolation différent?

Était-ce utile?

La solution

Dans un monde idéal que vous avez deux choix, et INSTANTANÉ LIRE INSTANTANÉ COMMIS (RCSI). Assurez-vous de comprendre les bases des niveaux d'isolement transaction avant de vous décider qui convient à votre charge de travail. Plus précisément être au courant les différents résultats vous pouvez voir à la suite de passer à RCSI.

Cela sonne comme ce n'est pas un monde idéal que vous ne disposez d'aucun contrôle sur l'application qui génère les instructions select. Dans ce cas, votre seule option est de permettre RCSI la base de données en question de sorte que les sélectionne utiliseront automatiquement RCSI au lieu de READ COMMITTED.

Autres conseils

Corriger, isolement de cliché pour obtenir des données cohérentes commises à partir avant que la transaction a commencé.

L'isolement READ UNCOMMITTED (alias indicateur NOLOCK) lit dirtz, des données incohérentes

Lorsque vous activez l'isolement SNAPSHOT, il prend effet pour tous SELECTs aller de l'avant. Vous exécutez ALTER DATABASE avec READ_COMMITTED_SNAPSHOT dans ce cas

Edit: ajout d'un lien + citation ALTER DATABASE (caractères gras ajoutés)

Permet l'option de capture instantanée en lecture Engagé au niveau de la base de données. Lorsqu'il est activé, DML commencent à générer des versions de ligne, même si aucune transaction utilise l'isolement instantané. Une fois que cette option est activé, les opérations spécifiant la lecture utilisation de niveau d'isolement engagé versioning de ligne au lieu de verrouillage. Quand un court de transaction à la lire le niveau d'isolement engagé, toutes les déclarations voir un instantané des données tel qu'il existe au début de l'instruction.

Et de aide d'isolement instantané ( mon gras)

L'option de base de données READ_COMMITTED_SNAPSHOT détermine le comportement de la valeur par défaut lors de l'isolement de cliché READ niveau d'isolement ENGAGE est activée dans une base de données. Si vous ne spécifiez pas explicitement READ_COMMITTED_SNAPSHOT ON, LIRE ENGAGE est appliquée à toutes les transactions implicites. Cela produit le même comportement que la mise en READ_COMMITTED_SNAPSHOT OFF (valeur par défaut). Lorsque READ_COMMITTED_SNAPSHOT OFF est en vigueur, les utilisations du moteur de base de données verrous partagés pour faire respecter le niveau d'isolation par défaut. Si vous définissez l'option de base de données READ_COMMITTED_SNAPSHOT sur ON, le moteur de base de données utilise le versioning de ligne et de l'isolement de cliché par défaut, au lieu d'utiliser des verrous pour protéger les données.

Alors, oui.

Activation RCSI se permet lit d'obtenir des données cohérentes et ne pas être bloqués par des écrivains WHI va continuer à utiliser Read Committed

Je vous suggère de lire la question suivante et ses réponses: Base de données les problèmes de verrouillage .

Trouver le niveau d'isolement droit d'utiliser au niveau db est la chose la plus rapide que vous pouvez faire dès maintenant pour vous aider à résoudre ce problème, car il est difficile maintenant de changer toutes les applications qui touchent la base de données et changer leur code. Puisque vous avez dit: « Je n'ai aucun contrôle sur le processus qui appelle les instructions select », la plus rapide réponse serait de passer le db à Read Committed d'isolement instantané, de sorte que vous ne toucherez pas les requêtes de lecture. Sinon, vous aurez besoin d'utiliser le niveau d'isolement instantané pour les sessions qui lisent les données lors de vos grandes transactions.

Plus de détails ici sur le choix du bon: Choisir isolation à base Versioning Row niveaux .

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top