Was die Transaktionsisolationsebenen von SQL:1992 angeht, so hat
InnoDB
die Standardeinstellung
REPEATABLE READ
. InnoDB
bietet alle vier Transaktionsisolationsebenen des SQL-Standards.
Die Standardisolationsebene können Sie mit der
--transaction-isolation
-Option auf der
Kommandozeile oder in einer Optionsdatei einstellen. So können
Sie beispielsweise im [mysqld]
-Abschnitt
einer Optionsdatei folgendes eintragen:
[mysqld] transaction-isolation = {READ-UNCOMMITTED | READ-COMMITTED | REPEATABLE-READ | SERIALIZABLE}
Ein Benutzer kann die Isolationsebene für eine einzelne Session
oder alle neuen Verbindungen mit der SET
TRANSACTION
-Anweisung einstellen, die folgende Syntax
hat:
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
Beachten Sie, dass in den Namen der Ebenen in der
--transaction-isolation
-Option Bindestriche
verwendet werden, aber nicht in der SET
TRANSACTION
-Anweisung.
Standardmäßig wird die Isolationsebene immer für die nächste
(noch nicht begonnene) Transaktion eingestellt. Mit dem
Schlüsselwort GLOBAL
stellt die Anweisung
die Standard-Transaktionsebene global für alle neuen
Verbindungen ein, die ab diesem Punkt aufgebaut werden (aber
nicht für die schon bestehenden Verbindungen). Um dies zu tun,
benötigen Sie die SUPER
-Berechtigung. Das
Schlüsselwort SESSION
stellt die
Standard-Transaktionsebene für alle zukünftigen Transaktionen
auf aktuellen Verbindung ein.
Jeder Client kann die Session-Isolationsebene (sogar inmitten einer Transaktion), oder die Isolationsebene der nächsten Transaktion haben.
Ob die Transaktionsisolationsebene global oder für die einzelne
Session eingestellt wurde, können Sie anhand der
Systemvariablen tx_isolation
mit folgenden
Anweisungen ermitteln:
SELECT @@global.tx_isolation; SELECT @@tx_isolation;
Für Zeilensperren verwendet InnoDB
Next-Key-Locking. Das bedeutet, dass InnoDB
zusätzlich zu den Indexeinträgen auch die
„Lücke“ vor einem Indexeintrag sperrt, um zu
verhindern, dass andere Benutzer gerade dort etwas einfügen.
Eine Next-Key-Sperre ist eine Sperre, die nicht nur den
Indexeintrag, sondern auch die Lücke vor diesem blockiert. Eine
Gap-Sperre ist eine Sperre, die lediglich die Lücke vor einem
Indexeintrag betrifft.
Im Folgenden werden die Isolationsebenen in
InnoDB
genauer erläutert:
READ UNCOMMITTED
SELECT
-Anweisungen werden ohne Sperren
ausgeführt, wobei es jedoch möglich ist, dass eine ältere
Version eines Eintrags verwendet wird. Also sind
Leseoperationen mit dieser Isolationsebene nicht konsistent
(man bezeichnet dies auch als „Dirty Read“).
Ansonsten funktioniert diese Isolationsebene wie
READ COMMITTED
.
READ COMMITTED
Eine Oracle-ähnliche Isolationsebene. Alle SELECT
… FOR UPDATE
- und SELECT …
LOCK IN SHARE MODE
-Anweisungen sperren nur die
Indexeinträge und nicht die Lücken davor. So können neben
den gesperrten Einträgen nach Belieben neue Datensätze
eingefügt werden. UPDATE
- und
DELETE
-Anweisungen, die einen eindeutigen
Index mit einer eindeutigen Suchbedingung verwenden, können
nur den gefundenen Indexeintrag, aber nicht die Lücke
davor, sperren. In Bereichs-UPDATE
s und
DELETE
s muss InnoDB
Next-Key- oder Gap-Sperren setzen und Einfügungen anderer
Benutzer in die Lücken, die in dem Bereich liegen,
blockieren. Dies ist erforderlich, da die Replikation und
Recovery von MysQL nur funktioniert, wenn keine
„Phantomzeilen“ vorhanden sind.
Konsistente Leseoperationen verhalten sich wie in Oracle: Jede konsistente Leseoperation, sogar innerhalb derselben Transaktion, setzt und liest ihren eigenen, frischen Snapshot. Siehe Abschnitt 14.2.10.4, „Konsistentes Lesen“.
REPEATABLE READ
Die Standardisolationsebene von InnoDB
.
SELECT … FOR UPDATE
-,
SELECT … LOCK IN SHARE MODE
-,
UPDATE
- und
DELETE
-Anweisungen, die einen eindeutigen
Index mit einer eindeutigen Suchbedingung verwenden, sperren
nur den gefundenen Indexeintrag, aber nicht die Lücke
davor. Für andere Suchbedingungen setzen diese Operationen
Next-Key-Locking ein oder sperren den durchsuchten
Indexbereich mit Next-Key- oder Gap-Sperren und blockieren
dadurch Einfügungen anderer Benutzer.
In konsistenten Leseoperationen gibt es einen wichtigen
Unterschied zur Isolationsebene READ
COMMITTED
: Alle konsistenten Leseoperationen
innerhalb derselben Transaktion lesen denselben Snapshot,
der von der ersten Leseoperation eingerichtet wurde. Daraus
folgt: Wenn Sie mehrere einfache
SELECT
-Anweisungen innerhalb derselben
Transaktion erteilen, sind diese
SELECT
-Anweisungen auch untereinander
konsistent. Siehe Abschnitt 14.2.10.4, „Konsistentes Lesen“.
SERIALIZABLE
Wie REPEATABLE READ
, nur dass
InnoDB
implizit alle einfachen
SELECT
-Anweisungen zu SELECT
… LOCK IN SHARE MODE
committet.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.