Grundlegendes zu IsolationsstufenUnderstanding isolation levels

HerunterladenJDBC-Treiber herunterladenDownloadDownload JDBC Driver

Transaktionen geben eine Isolationsstufe an, mit der definiert wird, bis zu welchem Ausmaß eine Transaktion von Ressourcen- oder Datenänderungen isoliert sein muss, die von anderen Transaktionen durchgeführt werden.Transactions specify an isolation level that defines the degree to which one transaction must be isolated from resource or data modifications made by other transactions. Die einzelnen Isolationsstufen werden dahin gehend beschrieben, welche Parallelitätsnebeneffekte (wie z. B. Dirty Reads oder Phantomlesezugriffe) zulässig sind.Isolation levels are described in terms of which concurrency side effects, such as dirty reads or phantom reads, are allowed.

Transaktionsisolationsstufen steuern Folgendes:Transaction isolation levels control the following:

  • Ob beim Lesen von Daten Sperren aktiviert werden können, und welcher Sperrentyp angefordert wird.Whether locks are taken when data is read, and what type of locks are requested.

  • Wie lange die Lesesperren aufrechterhalten werden.How long the read locks are held.

  • Ob ein Lesevorgang, der auf Zeilen verweist, die durch eine andere Transaktion geändert wurden:Whether a read operation referencing rows modified by another transaction:

    • blockiert wird, bis die exklusive Sperre für die Zeile aufgehoben wird.Block until the exclusive lock on the row is freed.

    • die durch einen Commit bestätigte Version der Zeile abruft, die zum Zeitpunkt des Anweisungs- oder Transaktionsstarts vorhanden war.Retrieve the committed version of the row that existed at the time the statement or transaction started.

    • die Datenänderung liest, für die noch kein Commit ausgeführt wurde.Read the uncommitted data modification.

Das Auswählen einer Transaktionsisolationsstufe hat keine Auswirkungen auf die Sperren, die zum Schutz von Datenänderungen eingerichtet werden.Choosing a transaction isolation level doesn't affect the locks that are acquired to protect data modifications. Eine Transaktion erhält immer eine exklusive Sperre für alle von ihr geänderten Daten und hält diese Sperre bis zum Abschluss der Transaktion aufrecht, und zwar unabhängig davon, welche Isolationsstufe für diese Transaktion festgelegt wurde.A transaction always gets an exclusive lock on any data it modifies and holds that lock until the transaction completes, regardless of the isolation level set for that transaction. Für Lesevorgänge wird durch die Transaktionsisolationsstufen in erster Linie der Grad des Schutzes vor den Auswirkungen der Änderungen definiert, die durch andere Transaktionen vorgenommen werden.For read operations, transaction isolation levels primarily define the level of protection from the effects of modifications made by other transactions.

Eine niedrigere Isolationsstufe erhöht einerseits die Möglichkeit, dass viele Benutzer gleichzeitig auf Daten zugreifen können, führt aber auch dazu, dass die Benutzer mit einem Anstieg der Parallelitätseffekte (Dirty Reads oder verlorene Updates) rechnen müssen.A lower isolation level increases the ability of many users to access data at the same time, but increases the number of concurrency effects, such as dirty reads or lost updates, that users might encounter. Umgekehrt schränkt eine höhere Isolationsstufe zwar die Typen der Parallelitätseffekte ein, mit denen Benutzer rechnen müssen, gleichzeitig werden dafür aber mehr Systemressourcen beansprucht, und die Wahrscheinlichkeit steigt, dass sich die Transaktionen gegenseitig blockieren.Conversely, a higher isolation level reduces the types of concurrency effects that users might encounter, but requires more system resources and increases the chances that one transaction will block another. 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.Choosing the appropriate isolation level depends on balancing the data integrity requirements of the application against the overhead of each isolation level. Die höchste Isolationsstufe (Serializable) garantiert, dass eine Transaktion jedes Mal, wenn sie einen Lesevorgang wiederholt, genau dieselben Daten liest. Dies wird jedoch durch ein Ausmaß an Sperren erreicht, das in Systemen mit mehreren Benutzern wahrscheinlich zu negativen Auswirkungen für andere Benutzer führt.The highest isolation level, serializable, guarantees that a transaction will retrieve exactly the same data every time it repeats a read operation, but it does this by performing a level of locking that is likely to impact other users in multi-user systems. 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.The lowest isolation level, read uncommitted, can retrieve data that has been modified but not committed by other transactions. In der Isolationsstufe „Read Uncommitted“ können sämtliche denkbaren Parallelitätsnebeneffekte auftreten, dagegen werden keine Lesesperren und keine Versionsverwaltung verwendet, wodurch der Aufwand minimiert wird.All concurrency side effects can happen in read uncommitted, but there's no read locking or versioning, so overhead is minimized.

BemerkungenRemarks

Die folgende Tabelle veranschaulicht, welche Parallelitätsnebeneffekte in den einzelnen Isolationsstufen zulässig sind.The following table shows the concurrency side effects allowed by the different isolation levels.

IsolationsebeneIsolation Level Dirty ReadDirty Read Non Repeatable ReadNon Repeatable Read PhantomPhantom
Read UncommittedRead uncommitted JaYes JaYes JaYes
Read CommittedRead committed NeinNo JaYes JaYes
Repeatable ReadRepeatable read NeinNo NeinNo JaYes
MomentaufnahmeSnapshot NeinNo NeinNo NeinNo
SerializableSerializable NeinNo NeinNo NeinNo

Transaktionen müssen mindestens auf der Isolationsstufe „Repeatable Read“ ausgeführt werden, um den Verlust von Updates zu verhindern. Dies kann auftreten, wenn zwei Transaktionen jeweils die gleiche Zeile abrufen und sie später auf Grundlage der zunächst abgerufenen Werte aktualisieren.Transactions must be run at an isolation level of at least repeatable read to prevent lost updates that can occur when two transactions each retrieve the same row, and then later update the row based on the originally retrieved values. 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.If the two transactions update rows using a single UPDATE statement and don't base the update on the previously retrieved values, lost updates can't occur at the default isolation level of read committed.

Zum Festlegen der Isolationsstufe für eine Transaktion können Sie die setTransactionIsolation-Methode der SQLServerConnection-Klasse verwenden.To set the isolation level for a transaction, you can use the setTransactionIsolation method of the SQLServerConnection class. Diese Methode nimmt einen ganzzahligen Wert als Argument an. Dieser basiert wie im Folgenden dargestellt auf den Verbindungskonstanten:This method accepts an int value as its argument, which is based on one of the connection constants as in the following:

con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);  

Zum Verwenden der neuen Snapshotisolationsstufe von SQL ServerSQL Server können Sie eine der SQLServerConnection-Konstanten verwenden:To use the new snapshot isolation level of SQL ServerSQL Server, you can use one of the SQLServerConnection constants:

con.setTransactionIsolation(SQLServerConnection.TRANSACTION_SNAPSHOT);  

oder Sie können Folgendes verwenden:or you can use:

con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED + 4094);  

Weitere Informationen zu SQL ServerSQL Server-Isolationsstufen finden Sie unter „Isolationsstufen in Datenbank-EngineDatabase Engine“ in der SQL ServerSQL Server-Onlinedokumentation.For more information about SQL ServerSQL Server isolation levels, see "Isolation Levels in the Datenbank-EngineDatabase Engine" in SQL ServerSQL Server Books Online.

Siehe auchSee also

Ausführen von Transaktionen mit dem JDBC-TreiberPerforming transactions with the JDBC driver