## Isolation-Level

### Verwendung

Der Isolation-Level bestimmt, wann das Datenbanksystem welche Sperren setzt.

Je mehr Sperren gesetzt werden und je länger die Sperren erhalten bleiben, desto weniger Parallelität ist im Datenbankbetrieb möglich. Je weniger Sperren gesetzt werden, desto mehr Phänomene treten auf und desto niedriger ist der Grad der garantierten Konsistenz.

Isolation-Level

Nummer | Name | Beschreibung
0 | Read Uncommitted | Das Datenbanksystem liest Zeilen, ohne Lesesperren anzufordern. Es ist dabei nicht sichergestellt, dass eine Zeile beim nochmaligen Lesen innerhalb einer Transaktion noch den gleichen Zustand hat wie beim ersten Lesen, weil sie in der Zwischenzeit durch eine andere Transaktion geändert worden sein kann. Außerdem ist nicht sichergestellt, dass das Datenbanksystem den Zustand einer gelesenen Zeile bereits mit einer COMMIT-Anweisung gespeichert hat. Es kann vorkommen, dass der gelesene Wert vom Datenbanksystem nicht gespeichert wird, sondern durch ein ROLLBACK wieder auf einen früheren Wert gesetzt wird. Beim Einfügen, Ändern und Löschen von Zeilen setzt das Datenbanksystem für die entsprechende Transaktion implizit Schreibsperren für die betroffenen Zeilen. Diese Sperren gibt das Datenbanksystem erst am Ende der Transaktion wieder frei.
1 bzw. 10 | Read Committed | Beim Lesen stellt das Datenbanksystem für jede gelesene Zeile sicher, dass zum Zeitpunkt des Lesens keine andere Transaktion eine Schreibsperre für diese Zeile hält. Beim Einfügen, Ändern und Löschen von Zeilen setzt das Datenbanksystem für die entsprechende Transaktion implizit Schreibsperren für die betroffenen Zeilen, die es erst am Ende der Transaktion wieder freigegibt.
15 |  | Zusätzlich zum unter Isolation-Level 1 beschriebenen Verhalten gilt, dass das Datenbanksystem für alle durch eine SQL-Anweisung angesprochenen Tabellen vor Beginn der Bearbeitung Lesesperren anfordert. Wenn eine SQL-Anweisung eine Ergebnistabelle erzeugt, die nicht permanent gespeichert wird, dann gibt das Datenbanksystem diese Sperren erst am Ende der Transaktion oder beim Schließen der Ergebnistabelle frei. Andernfalls gibt es die Sperren unmittelbar nach der Bearbeitung der SQL-Anweisung frei.
2 bzw. 20 | Repeatable Read | Zusätzlich zum unter Isolation-Level 1 beschriebenen Verhalten gilt, dass für alle durch eine SQL-Anweisung zur Datenanfrage angesprochenen Tabellen vor Beginn der Bearbeitung implizit Lesesperren angefordert werden. Wenn eine SQL-Anweisung eine Ergebnistabelle erzeugt, die nicht permanent gespeichert wird, dann gibt das Datenbanksystem diese Sperren erst am Ende der Transaktion oder beim Schließen der Ergebnistabelle frei. Andernfalls gibt es die Sperren unmittelbar nach der Bearbeitung der SQL-Anweisung frei. Bei folgenden SQL-Anweisungen ordnet das Datenbanksystem die Tabellen-Lesesperre der Transaktion nicht zu: SQL-Anweisungen, bei denen genau eine Zeile einer Tabelle bearbeitet wird, die durch Schlüsselspezifikationen oder durch CURRENT OF <result_table_name> bestimmt wird. Darüber hinaus gilt, dass das Datenbanksystem der Transaktion für jede während der Bearbeitung einer SQL-Anweisung gelesene Zeile implizit eine Lesesperre zuordnet. Diese Sperren können nur durch eine UNLOCK-Anweisung oder durch Beendigung der Transaktion freigegeben werden. Beim Einfügen, Ändern und Löschen von Zeilen ordnet das Datenbanksystem der Transaktion implizit Schreibsperren für die betroffenen Zeilen zu, die erst am Transaktionsende freigegeben werden. Es setzt jedoch keine Sperren für die gesamte Tabelle.
3 bzw. 30 | Serializable | Zusätzlich zum unter Isolation-Level 2 beschriebenen Verhalten gilt, dass eine Transaktion für jede durch eine SQL-Anweisung angesprochene Tabelle implizit eine Tabellen-Lesesperre zugeordnet wird. Diese Lesesperren können nur durch Beendigung der Transaktion freigegeben werden. Diese Tabellen-Lesesperre wird der Transaktion nicht zugeordnet bei SQL-Anweisungen, bei denen genau eine Zeile einer Tabelle bearbeitet wird, die durch Schlüsselspezifikationen oder durch CURRENT OF <result_table_name> bestimmt wird. Beim Einfügen, Ändern und Löschen von Zeilen ordnet das Datenbanksystem der Transaktion implizit Schreibsperren für die betroffenen Zeilen zu, die erst am Transaktionsende freigegeben werden.

1 und 10 sind nur unterschiedliche Schreibweisen desselben Isolation-Level. Sie unterscheiden sich nicht in ihrer Bedeutung. Dasselbe gilt für 2 und 20 sowie 3 und 30.

### Aktivitäten

Der Vorschlagswert für den Isolation-Level ist vom SQL-Modus abhängig:

● ANSI: 3

● alle anderen: 1

Sie können den Isolation-Level beim Eröffnen einer Datenbanksitzung mit der CONNECT-Anweisung oder für eine einzelne SQL-Anweisung übersteuern.

Siehe SQL-Referenzhandbuch,

● CONNECT-Anweisung (connect_statement)

● LOCK-Option (lock_option)

Sie können den Isolation-Level einer Loader-Sitzung mit dem SET-Kommando festlegen, für einzelne Benutzer diese Festlegung mit dem USE USER-Kommando übersteuern oder im EXPORT COLUMNS-Kommando mit der LOCK-Option in der SELECT-Anweisung den gewünschten Isolation-Level angeben.

Siehe Loader,

● SET-Kommando

● USE USER-Kommando

● EXPORT COLUMNS-Kommando