web-dev-qa-db-fra.com

SQL Server - Quel niveau d'isolement pour les instructions de sélection non bloquantes?

J'ai une longue transaction en cours d'exécution (appelée, dire, T1) qui effectue des suppresses, des mises à jour et des insertions sur une table dans SQL Server 2008 R2. Dans le même temps, un autre processus exécute périodiquement des déclarations de sélection de cette table.

Sous Paramètres d'isolation par défaut (lu engagé, je pense?), T1 bloque toutes les instructions de sélection de l'exécution jusqu'à ce que la transaction s'engage ou est renvoyée.

Ce que j'aimerais voir, c'est que les instructions Select fonctionnent sur des données cohérentes, même si la transaction est en cours. Je crois que l'isolement de l'instantané peut aider, mais je ne suis pas sûr que je pars dans la bonne direction. Serait-ce le meilleur niveau d'isolement pour cette application?

Deuxièmement, je n'ai aucun contrôle sur le processus qui appelle les instructions sélectionnées, mais j'ai le contrôle de l'application .NET qui appelle T1. Des modifications de niveau d'isolement seraient-elles requises sur les instructions de sélection et T1, ou seraient-elles suffisantes pour marquer juste T1 comme ayant un niveau d'isolement différent?

9
growse

Dans un monde idéal, vous auriez deux choix, instantanés et lire un instantané engagé (RCSI). Assurez-vous de comprendre les bases des niveaux d'isolation des transactions Avant de décider qui convient à votre charge de travail. Spécifiquement soyez conscient des différents résultats Vous pouvez voir à la suite de déménager dans RCSI.

Cela ressemble à ce que ce n'est pas un monde idéal car vous n'avez aucun contrôle sur l'application qui génère les instructions de sélection. Dans ce cas, votre seule option consiste à activer RCSI pour la base de données en question de sorte que les SELECTS utilisent automatiquement RCSI au lieu de lire commis.

8
Mark Storey-Smith

Corrigez, utilisez l'isolement de l'instantané pour obtenir une cohérence, des données commises avant le début de la transaction.

L'isolation de lecture non engagée (AKA Nolock Asset) lira Dirtz, des données incohérentes

Lorsque vous activez l'isolement de l'instantané, il est nécessaire d'effectuer un effet pour tous les éléments sélectionnés. Vous courez ALTER DATABASE avec read_committed_snapshot dans ce cas

EDIT: Ajout de lien + Devis de modification de la base de données (mon audacieux)

Permet une option d'instantanée de lecture à la lecture au niveau de la base de données. Lorsqu'il est activé, Les instructions DML commencent à générer des versions de ligne, même lorsqu'aucune transaction utilise une isolation d'instantané. Une fois cette option activée, Les transactions spécifiant le niveau d'isolation de la lecture de la ligne d'isolation utilisent à la place. de verrouillage. Quand une transaction fonctionne au niveau Lisez le niveau d'isolement engagé, Toutes les instructions voient un instantané de données car il existe au début de la déclaration.

Et de - tilisation de l'isolement de l'instantané (mon audacieux)

L'option de base de données READ_COMMITED_SNAPSHOT détermine le comportement de la valeur par défaut Lisez le niveau d'isolement commis Lorsque l'isolation d'instantané est activé dans une base de données. Si vous ne spécifiez pas explicitement, LIVE_COMMITED_SNAPSHOT ON, LIRE Engagé est appliqué à toutes les transactions implicites. Cela produit le même comportement que le paramètre Lecture_Committed_snapshot Off (la valeur par défaut). Lorsque Read_Committed_snapshot Off est en vigueur, le moteur de base de données utilise des verrous partagés pour appliquer le niveau d'isolement 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 l'isolation de la version de ligne et de l'instantané comme par défaut, au lieu d'utiliser des verrous pour protéger les données.

Donc oui.

L'activation de la RCSI permettra à des lectures d'obtenir des données cohérentes et ne seront pas bloquées par des écrivains qui continueront à utiliser Lecture commise.

6
gbn

Je vous suggère de lire la question suivante et ses réponses: Problèmes de verrouillage de la base de données? .

Trouver le bon niveau d'isolement à utiliser au niveau de la DB est la chose la plus rapide que vous puissiez faire maintenant pour vous aider à résoudre ce problème, car il est difficile de modifier toutes les applications qui touchent la base de données et de modifier leur code. Étant donné que vous avez dit "Je n'ai aucun contrôle sur le processus qui appelle les instructions de sélection", la réponse la plus rapide consisterait à commuter la DB pour lire le niveau d'isolation de l'instantané instantané, de sorte que vous ne touchez pas les requêtes de lecture. Sinon, vous devez utiliser le niveau d'isolation de l'instantané pour les sessions qui lisent les données lors de vos grandes transactions.

Plus de détails ici sur le choix de la bonne: Choisir des niveaux d'isolation basés sur la ligne .

4
Marian