Le niveau d’isolation des transactions dans SQL Server et leur relation avec les lectures sale, non répétables, lectures fantômes, etc. (arguments de code et séquences temporelles)
En comprenant ces problèmes qui peuvent survenir en cas d’accès simultané à la base de données, nous pouvons continuer à comprendre le concept de niveau d’isolement de la base de données, en termes simples : comment voulez-vous isoler les transactions concurrentes, et dans quelle mesure ? Par exemple, si les lectures défectueuses peuvent être tolérées, ou si vous ne souhaitez pas que les transactions concurrentes aient des lectures incorrectes, celles-ci peuvent être réglées au niveau d’isolation pour rendre l’isolation entre les transactions concurrentes lâche ou sévère.
Plus le niveau d’isolement est élevé, moins il y a de risque de lire des données compromettantes ou incomplètes, mais plus la dégradation des performances est grave dans les systèmes à forte concurrence concurrencée. Plus le niveau d’isolation est faible, plus l’amélioration des performances du système concurrent est grande, mais les données elles-mêmes peuvent être incomplètes.
Dans SQL Server 2012, vous pouvez définir le niveau d’isolation d’une transaction (de faible à élevé) en utilisant cette syntaxe :
DÉFINIR LE NIVEAU D’ISOLATION DES TRANSACTIONS { LIRE NON ENGAGÉ | LIRE ENGAGÉ | LECTURE RÉPÉTABLE | INSTANTANÉ | SÉRIALISABLE } [ ; ] Tout d’abord, créez un nouveau script de test, créez une base de données et insérez les données de test, comme suit :
Créer une nouvelle fenêtre A, ouvre une transaction, effectue l’opération de mise à jour, et attends 10 secondes avant de valider, le code est le suivant :
Créer une nouvelle fenêtre B, définissez la transaction READ UNCOMMITTED (lecture non engagée, le niveau le plus bas, le problème facile est la lecture sale, car elle peut lire les données modifiées par d’autres transactions mais non validées.) Cela fait la même chose que de définir (NOLOCK) sur la table des objets d’instruction SELECT lors d’une transaction. Interrogez les données, le code est le suivant :
Créer une nouvelle fenêtre C, interroge directement les données, comme suit :
En retour,Exécutez les fenêtres A, B et C, et constatez qu’en mettant à jour les données, la fenêtre B peut immédiatement les renvoyer (Il est possible que la lecture soit des données compromettantes), la fenêtre C doit attendre que la fenêtre A termine son exécutionRetournera les données, comme montré dans la figure ci-dessous :
(Fenêtre B)
(Fenêtre C)
(Fin)
|