In den meisten Online-Foren und -Beispielen wird immer empfohlen, beide zu verwenden ALLOW_SNAPSHOT_ISOLATION
und diese READ_COMMITTED_SNAPSHOT
Option auf ON zu setzen, wenn jemand eine Frage zu Snapshot, Zeilenversionsverwaltung oder einer ähnlichen Frage stellt.
Ich denke, das Wort SNAPSHOT in beiden Einstellungen wird etwas verwirrend. Ich dachte, damit das Datenbankmodul die Zeilenversionierung anstelle von Sperren für das Standardverhalten von READ_COMMITTED verwendet, wird die Datenbank unabhängig von der Einstellung READ_COMMITTED_SNAPSHOT
auf ON gesetzt .ALLOW_SNAPSHOT_ISOLATION
Die ALLOW_SNAPSHOT_ISOLATION
Einstellung ist nur auf ON gesetzt, um die Snapshot-Isolation beim Starten einer Transaktion zu ermöglichen (z. B. SET TRANSACTION ISOLATION LEVEL SNAPSHOT), unabhängig von der READ_COMMITTED_SNAPSHOT
Einstellung.
Der einzige Grund, diese beiden Einstellungen auf ON zu setzen, besteht darin, dass READ COMMITTED-Zeilenversionierung UND Snapshot-Isolation erforderlich sind .
Meine Frage ist, ist mein Verständnis in irgendeiner Weise falsch? Und dass diese beiden Einstellungen immer zusammen auf ON gesetzt werden müssen (insbesondere für die READ COMMITTED-Zeilenversionierung)?
OK, ging nach Hause und getestet. Hier ist die Beobachtung.
Erster Test mit beiden Einstellungen als AUS bestätigt.
Abfrage 1
Abfrage 2
In diesem Test wartet Abfrage 2 darauf, dass Abfrage 1 festgeschrieben wird. Dm_tran_locks DMV zeigt diese exklusive Sperre für TABLE1 an, die von Abfrage 1 verursacht wurde.
Zweiter Test , vorherige Transaktion zurücksetzen, READ_COMMITTED_SNAPSHOT auf ON setzen, ALLOW_SNAPSHOT_ISOLATION jedoch auf OFF lassen.
Führen Sie Abfrage 1 und Abfrage 2 aus. DMV zeigt, dass Abfrage 1 eine exklusive Sperre aufweist, Abfrage 2 jedoch Details mit "Original" zurückgibt, ohne dass Abfrage 1 die Transaktion festschreibt. Es scheint, dass die READ_COMMITTED-Zeilenversionierung vorhanden ist.
Wenn Sie
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
Abfrage 1 und Abfrage 2 hinzufügen und Abfrage 1 oder Abfrage 2 ausführen, wird ein Fehler zurückgegeben. Die Snapshot-Isolationstransaktion konnte nicht auf die Datenbank 'TEST' zugreifen, da die Snapshot-Isolation in dieser Datenbank nicht zulässig ist. Verwenden Sie ALTER DATABASE, um die Snapshot-Isolierung zu ermöglichen.Dritter Test , Rollback der vorherigen Transaktion. Setzen Sie READ_COMMITTED_SNAPSHOT OFF und ALLOW_SNAPSHOT_ISOLATION ON.
Führen Sie Abfrage 1 und dann Abfrage 2 aus. DMV zeigt die von Abfrage 1 verursachte exklusive Sperre an. Abfrage 2 wartet anscheinend auf den Abschluss von Abfrage 1. Durch Aktivieren von ALLOW_SNAPSHOT_ISOLATION wird die READ COMMITTED-Zeilenversionierung nicht aktiviert.
Hinzufügen
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
zu Abfrage 1 und Abfrage 2. Führen Sie Abfrage 1 und dann Abfrage 2 aus. Während in DMV für Abfrage 1 eine exklusive Sperre angezeigt wird, gibt Abfrage 2 Details mit "Original" zurück. Die Snapshot-Isolierung scheint vorhanden zu sein.Die Beobachtung des Tests zeigt, dass
READ_COMMITTED_SNAPSHOT
die READ COMMITTED-Zeilenversionierung unabhängig von derALLOW_SNAPSHOT_ISOLATION
Einstellung aktiviert / deaktiviert wird und umgekehrt.quelle
Dein Verständnis ist korrekt. Ich mag die kurze, klare und einfache Definition von hier :
Es scheint, dass viele Missverständnisse von MS selbst herrühren. Zum Beispiel sagen sie hier :
Die erwähnte "Snapshot-Isolation" ist jedoch nicht gleichbedeutend mit dem Verhalten der Transaktion, für die sie
set transaction isolation level snapshot
angewendet wird.Wie für den Unterschied ist schön Erklärung hier .
Wahrscheinlich wäre es besser, wenn READ_COMMITTED_SNAPSHOT als READ_COMMITTED_ROW_VERSIONING oder so ähnlich bezeichnet würde. :)
quelle
Ich mag diese Zusammenfassung von Microsoft :
quelle