In Zeilensperren verwendet InnoDB
einen
Algorithmus namens Next-Key-Locking.
InnoDB
sperrt Zeilen so, dass es beim
Durchsuchen oder Scannen eines Tabellenindex Shared- oder
exklusive Sperren auf den gefundenen Indexeinträgen errichtet.
Also sind die Zeilensperren in Wirklichkeit
Indexeintragssperren.
Die Sperren, die InnoDB
auf Indexeinträgen
errichtet, betreffen auch die „Lücke“ vor den
Einträgen. Wenn ein Benutzer eine Shared- oder exklusive Sperre
auf Eintrag R
eines Index hält, kann kein
anderer Benutzer unmittelbar vor R
einen
Eintrag in die Indexreihenfolge einfügen. Durch dieses so
genannte „Gap-Locking“ wird das
„Phantom-Problem“ gelöst. Angenommen, Sie wollten
alle Kinder der child
-Tabelle lesen und
sperren, deren Identifier-Wert größer als 100 ist, um später
eine Spalte in den ausgewählten Zeilen zu ändern:
SELECT * FROM child WHERE id > 100 FOR UPDATE;
Angenommen, Sie haben einen Index auf der Spalte
id
. Die Anfrage scannt diesen Index ab dem
ersten Eintrag, dessen id
größer als 100
ist. Wenn die Sperren auf den Indexeinträgen Einfügungen in
die Lücken nicht verhindern würden, könnte in der
Zwischenzeit eine neue Zeile in die Tabelle eingefügt werden.
Wenn Sie dasselbe SELECT
in derselben
Transaktion ein zweites Mal ausführten, hätten Sie plötzlich
eine zusätzliche Zeile in der Ergebnismenge. Das verstößt
aber gegen das Isolationsprinzip von Transaktionen: Eine
Transaktion muss so ablaufen, dass sich die Daten, die sie
liest, während ihrer Laufzeit nicht ändern können. Wenn wir
eine Zeilenmenge als ein Datenelement betrachten, würde die
neue „Phantomzeile“ dieses Isolationsprinzip
verletzen.
Wenn InnoDB
einen Index scannt, kann es auch
die Lücke hinter dem letzten Eintrag im Index sperren. Genau
dies geschieht auch im obigen Beispiel: Die von
InnoDB
gesetzten Sperren verhindern jede
Einfügung in die Tabelle an Stellen, deren
id
größer als 100 ist.
Mit Next-Key-Locking können Sie eine Eindeutigkeitsprüfung in Ihrer Anwendung implementieren. Wenn Sie Ihre Daten im Share-Modus lesen und kein Duplikat der Zeile sehen, die Sie einfügen möchten, dann können Sie die Einfügung beruhigt ausführen und wissen, dass die Next-Key-Sperre auf dem Nachfolger Ihrer Zeile verhindert, dass in der Zwischenzeit jemand anders ein Duplikat Ihrer Zeile einfügt.
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.