Grundlegendes zu Isolationsstufen
Transaktionen geben eine Isolationsstufe an, die bestimmt, wie eine Transaktion von anderen Transaktionen isoliert ist. Isolation ist die Trennung von Ressourcen- oder Datenänderungen durch verschiedene Transaktionen. Isolationsstufen werden basierend darauf beschrieben, welche Parallelitätsnebeneffekte (wie z. B. Dirty Reads oder Phantomlesezugriffe) zulässig sind.
Transaktionsisolationsstufen steuern Folgendes:
Ob beim Lesen von Daten Sperren aktiviert werden können, und welcher Sperrentyp angefordert wird.
Wie lange die Lesesperren aufrechterhalten werden.
Ob ein Lesevorgang, der auf Zeilen verweist, die durch eine andere Transaktion geändert wurden:
blockiert wird, bis die exklusive Sperre für die Zeile aufgehoben wird.
die durch einen Commit bestätigte Version der Zeile abruft, die zum Zeitpunkt des Anweisungs- oder Transaktionsstarts vorhanden war.
die Datenänderung liest, für die noch kein Commit ausgeführt wurde.
Wählen einer Isolationsstufe
Das Auswählen einer Transaktionsisolationsstufe hat keine Auswirkungen auf die Sperren, die zum Schutz von Datenänderungen eingerichtet werden. Eine Transaktion erhält immer eine exklusive Sperre für alle Daten, die sie ändert. Diese Sperre gilt bis zum Abschluss der Transaktion unabhängig von der Isolationsstufe, die für diese Transaktion festgelegt ist. Bei Lesevorgängen bestimmen Transaktionsisolationsstufen hauptsächlich, wie der Vorgang vor den Auswirkungen anderer Transaktionen geschützt wird.
Eine niedrigere Isolationsstufe erhöht die Möglichkeit, dass viele Benutzer gleichzeitig auf die Daten zugreifen können. Dadurch erhöht sich jedoch die Anzahl von Parallelitätseffekten, z. B. Dirty Reads oder Verlust von Aktualisierungen, die bei Benutzern möglicherweise auftreten. Umgekehrt reduziert eine höhere Isolationsstufe die Arten von Parallelitätseffekten, die bei den Benutzern auftreten können. Sie erfordert jedoch mehr Systemressourcen und erhöht die Wahrscheinlichkeit, dass eine Transaktion eine andere blockiert. So muss bei jeder Auswahl der geeigneten Isolationsstufe eine Abwägung zwischen den Datenintegritätsanforderungen der Anwendungen einerseits und dem mit jeder Isolationsstufe verbundenen Aufwand andererseits erfolgen.
Die höchste Isolationsstufe (Serializable) garantiert, dass eine Transaktion jedes Mal, wenn sie einen Lesevorgang wiederholt, genau dieselben Daten liest. Es wird jedoch eine Sperrstufe verwendet, die sich in Mehrbenutzersystemen auf andere Benutzer auswirken kann. Mit der niedrigsten Isolationsstufe (Read Uncommitted) können Daten abgerufen werden, die von anderen Transaktionen geändert wurden, für die jedoch noch kein Commit ausgeführt wurde. Bei der Isolationsstufe „Read Uncommitted“ können sämtliche denkbaren Parallelitätsnebenwirkungen auftreten. Es erfolgen jedoch weder Lesesperren noch eine Versionsverwaltung, wodurch der Aufwand minimiert wird.
Hinweise
Die folgende Tabelle veranschaulicht, welche Parallelitätsnebeneffekte in den einzelnen Isolationsstufen zulässig sind.
Isolationsstufe | Dirty Read | Non-Repeatable Read | Phantom |
---|---|---|---|
Read Uncommitted | Ja | Ja | Ja |
Read Committed | Nein | Ja | Ja |
Repeatable Read | Nein | Nein | Ja |
Momentaufnahme | Nein | Nr. | Nein |
Serialisierbar | Nein | Nr. | Nein |
Transaktionen müssen mit mindestens der Isolationsstufe „Repeatable Read“ (Wiederholbarer Lesevorgang) ausgeführt werden, um den Verlust von Aktualisierungen zu verhindern, der auftreten kann, wenn zwei Transaktionen dieselbe Zeile abrufen. Die Transaktion aktualisiert dann später die Zeile basierend auf den ursprünglich abgerufenen Werten. Wenn die beiden Transaktionen Zeilen mit einer einzigen UPDATE-Anweisung aktualisieren und die Aktualisierung nicht auf Grundlage der zuvor abgerufenen Werte erfolgt, können bei der Standardisolationsstufe „Read Committed“ keine verlorenen Aktualisierungen auftreten.
Zum Festlegen der Isolationsstufe für eine Transaktion können Sie die setTransactionIsolation-Methode der SQLServerConnection-Klasse verwenden. Diese Methode nimmt einen ganzzahligen Wert als Argument an. Dieser basiert wie im Folgenden dargestellt auf den Verbindungskonstanten:
con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
Zum Verwenden der neuen Snapshotisolationsstufe von SQL Server können Sie eine der SQLServerConnection
-Konstanten verwenden:
con.setTransactionIsolation(SQLServerConnection.TRANSACTION_SNAPSHOT);
oder Sie können Folgendes verwenden:
con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED + 4094);
Weitere Informationen zu SQL Server-Isolationsstufen finden Sie unter „Isolationsstufen in Datenbank-Engine“ in der SQL Server-Onlinedokumentation.
Weitere Informationen
Ausführen von Transaktionen mit dem JDBC-Treiber
SET TRANSACTION ISOLATION LEVEL (Transact-SQL)