Freigeben über


Transaktionsisolationsstufen in speicheroptimierten Tabellen

Die folgenden Isolationsstufen werden für Transaktionen unterstützt, die auf speicheroptimierte Tabellen zugreifen.

  • SNAPSHOT

  • REPEATABLE READ

  • SERIALIZABLE

  • READ COMMITTED

Die Transaktionsisolationsstufe kann als Teil des Atomic-Blocks einer systemintern kompilierten gespeicherten Prozedur angegeben werden. Weitere Informationen finden Sie unter CREATE PROCEDURE (Transact-SQL). Wenn Sie über interpretierte Transact-SQL auf speicheroptimierte Tabellen zugreifen, kann die Isolationsstufe mithilfe von Hinweisen auf Tabellenebene angegeben werden.

Sie müssen die Transaktionsisolationsstufe angeben, wenn Sie eine systemintern kompilierte gespeicherte Prozedur definieren. Sie müssen die Isolationsstufe in Tabellenhinweisen angeben, wenn Sie über Benutzertransaktionen in interpretiertem Transact-SQL auf speicheroptimierte Tabellen zugreifen. Weitere Informationen finden Sie unter Richtlinien für Transaktionsisolationsstufen mit Memory-Optimized Tabellen.

Die Isolationsstufe READ COMMITTED wird für speicheroptimierte Tabellen mit Autocommittransaktionen unterstützt. READ COMMITTED ist in Benutzertransaktionen oder in einem atomaren Block nicht zulässig. READ COMMITTED wird mit expliziten oder impliziten Benutzertransaktionen nicht unterstützt. Die READ_COMMITTED_SNAPSHOT-Isolationsstufe wird für speicheroptimierte Tabellen mit Autocommittransaktionen und nur dann unterstützt, wenn die Abfrage nicht auf datenträgerbasierte Tabellen zugreift. Darüber hinaus können Transaktionen, die mit interpretiertem Transact-SQL mit SNAPSHOT-Isolation gestartet werden, nicht auf speicheroptimierte Tabellen zugreifen. Transaktionen, die interpretierte Transact-SQL mit REPEATABLE READ- oder SERIALIZABLE-Isolation verwenden, müssen mithilfe der SNAPSHOT-Isolation auf speicheroptimierte Tabellen zugreifen. Weitere Informationen zu diesem Szenario finden Sie unter Containerübergreifende Transaktionen.

READ COMMITTED ist die Standardisolationsstufe in SQL Server. Wenn die Isolationsstufe der Sitzung READ COMMITED (oder niedriger) ist, können Sie eine der folgenden Maßnahmen ergreifen:

  • Verwenden Sie zum Zugreifen auf die speicheroptimierte Tabelle explizit einen Hinweis für eine höhere Isolationsstufe (z. B. WITH (SNAPSHOT)).

  • Geben Sie die SET-Option MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT an. Damit wird die Isolationsstufe für speicheroptimierte Tabellen auf SNAPSHOT festgelegt (wie bei der Einbindung von WITH(SNAPSHOT)-Hinweisen für alle speicheroptimierten Tabellen). Weitere Informationen zu MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOTfinden Sie unter ALTER DATABASE SET-Optionen (Transact-SQL).

Falls die Isolationsstufe der Sitzung READ COMMITTED ist, können Sie alternativ Autocommittransaktionen verwenden.

SNAPSHOT-Transaktionen, die in interpretiertem Transact-SQL gestartet wurden, können nicht auf speicheroptimierte Tabellen zugreifen.

Die Transaktionsisolationsstufen, die für speicheroptimierte Tabellen unterstützt werden, bieten dieselben logischen Garantien wie datenträgerbasierte Tabellen. Zum Bereitstellen von Isolationsstufengarantien wird ein anderer Mechanismus verwendet.

Für datenträgerbasierte Tabellen werden die meisten Isolationsstufengarantien durch Sperren implementiert, wodurch Blockierungskonflikte verhindert werden. Bei speicheroptimierten Tabellen werden die Garantien mithilfe eines Konflikterkennungsmechanismus erzwungen, der die Anwendung von Sperren verhindert. Die Ausnahme besteht in der SNAPSHOT-Isolation bei datenträgerbasierten Tabellen. Die entsprechende Implementierung ähnelt der SNAPSHOT-Isolation bei speicheroptimierten Tabellen mit einem Konflikterkennungsmechanismus.

SNAPSHOT
Diese Isolationsstufe gibt an, dass die von einer beliebigen Anweisung in einer Transaktion gelesenen Daten der im Hinblick auf Transaktionen konsistenten Version der Daten entsprechen, die zu Beginn der Transaktion vorhanden waren. Die Transaktion kann nur Datenänderungen erkennen, für die vor dem Beginn der Transaktion ein Commit ausgeführt wurde. Datenänderungen, die nach Beginn der aktuellen Transaktion von anderen Transaktionen vorgenommen wurden, sind für in der aktuellen Transaktion ausgeführte Anweisungen nicht sichtbar. Die Anweisungen in einer Transaktion erhalten eine Momentaufnahme der Daten, für die ein Commit ausgeführt wurde, wie sie zu Beginn der Transaktion vorhanden waren.

Schreibvorgänge (Updates, Einfügungen und Löschungen) sind immer vollständig von anderen Transaktionen isoliert. Daher können die Schreibvorgänge einer SNAPSHOT-Transaktion mit den Schreibvorgängen anderer Transaktionen in Konflikt geraten. Wenn die aktuelle Transaktion versucht, eine Zeile zu aktualisieren oder zu löschen, die durch eine andere Transaktion aktualisiert oder gelöscht wurde, für die ein Commit ausgeführt wurde, nachdem die aktuelle Transaktion gestartet wurde, wird die Transaktion mit der folgenden Fehlermeldung beendet.

Fehler 41302. Für die aktuelle Transaktion wurde versucht, einen Datensatz in der Tabelle X zu aktualisieren, der aktualisiert wurde, nachdem diese Transaktion gestartet wurde. Die Transaktion wurde abgebrochen.

Wenn die aktuelle Transaktion versucht, eine Zeile mit dem gleichen Primärschlüsselwert wie eine Zeile einzufügen, die durch eine andere Transaktion eingefügt wurde, für die vor der aktuellen Transaktion ein Commit ausgeführt wurde, kommt es zu einem Commitfehler mit der folgenden Fehlermeldung.

Fehler 41325. Für die aktuelle Transaktion wurde aufgrund eines serialisierbaren Überprüfungsfehlers kein Commit ausgeführt.

Wenn eine Transaktion in eine Tabelle schreibt, die gelöscht wird, bevor für die Transaktion ein Commit ausgeführt wird, wird die Transaktion mit folgender Fehlermeldung beendet:

Fehler 41305. Fehler beim Ausführen eines Commits für die aktuelle Transaktion aufgrund eines REPEATABLE READ-Überprüfungsfehlers.

REPEATABLE READ
Diese Isolationsstufe enthält die Garantien, die von der SNAPSHOT-Isolationsstufe gegeben wurden. Darüber hinaus garantiert REPEATABLE READ, dass Zeilen, die von der Transaktion zum Zeitpunkt der Ausführung des Commits durch die Transaktion gelesen werden, nicht von einer anderen Transaktion geändert wurden. Jeder Lesevorgang der Transaktion kann bis zum Ende der Transaktion wiederholt werden.

Wenn die aktuelle Transaktion eine Zeile gelesen hat, die durch eine andere Transaktion aktualisiert wurde, für die vor der aktuellen Transaktion ein Commit ausgeführt wurde, schlägt der Commit mit der folgenden Fehlermeldung fehl.

Fehler 41305. Fehler beim Ausführen eines Commits für die aktuelle Transaktion aufgrund eines REPEATABLE READ-Überprüfungsfehlers.

SERIALIZABLE
Diese Isolationsstufe umfasst die durch REPEATABLE READ gewährten Garantien. Zwischen der Momentaufnahme und dem Ende der Transaktion sind keine Phantomzeilen aufgetreten. Phantomzeilen entsprechen der Filterbedingung einer Auswahl, eines Updates oder einer Löschung.

Die Transaktion wurde ausgeführt, als seien keine gleichzeitigen Transaktionen vorhanden. Alle Aktionen werden praktisch an einem einzelnen Serialisierungspunkt (Commitzeit) ausgeführt.

Wenn eine dieser Garantien verletzt wird, kann für die Transaktion kein Commit ausgeführt werden, und es wird die folgende Fehlermeldung angezeigt:

Fehler 41325. Für die aktuelle Transaktion wurde aufgrund eines serialisierbaren Überprüfungsfehlers kein Commit ausgeführt.

Weitere Informationen

Grundlegendes zu Transaktionen in speicheroptimierten Tabellen
Richtlinien für Transaktionsisolationsstufen mit speicheroptimierten Tabellen
Richtlinien zur Wiederholungslogik für Transaktionen auf speicheroptimierten Tabellen