Kapitel 8: MySQL-Tab ellentypen 509
Sehen wir ein neues Kind in der Ergebnismenge, die die Anfrage zur¨uckgibt. Das verst¨oßt
gegen das Isolationsprinzip von Transaktionen: Eine Transaktion sollte in der Lage sein, so
abzulaufen, dass die Daten, die sie gelesen hat, sich nicht w¨ahrend der Transaktion ¨andern.
Wenn wir einen Satz von Zeilen als Daten-Posten betrachten, w¨urde das neue ’Phantom’-
Kind dieses Isolationsprinzip durchbrechen.
Wenn InnoDB einen Index scannt, kann es auch die L¨ucke nach dem letzten Datensatz im
Index sperren. Genau das passiert im vorherigen Beispiel: Die Sperren, die von InnoDB
gesetzt werden, verhindert jedes Einf¨ugen in die Tabelle an Stellen, wo ID gr¨oßer als 100
ist.
Sie k¨onnen N¨achsten-Schl¨ussel-Sperren dazu benutzen, eine Eindeutigkeitspr¨ufung in Ihre
Applikation zu implementieren: Wenn Sie Ihre Daten im Share-Modus lesen und kein Du-
plikat f¨ur eine Zeile sehen, die Sie einf¨ugen werden, k¨onnen Sie Ihre Zeile sicher einf¨ugen
und wissen, dass das N¨achsten-Schl¨ussel-Sperren verhindern wird, dass zwischenzeitlich je-
mand eine Duplikatzeile Ihrer Zeile einf¨ugt. Daher gestattet Ihnen das N¨achsten-Schl¨ussel-
Sperren, die Nicht-Existenz von irgend etwas in Ihrer Tabelle zu ’sperren’.
8.5.8.4 Sperren, die in InnoDB durch unterschiedliche SQL-
Statements gesetzt werden
• SELECT ... FROM ... : Das ist Konsistentes Lesen, es wird ein Schnappschuss einer
Datenbank gelesen und es werden keine Sperren gesetzt.
• SELECT ... FROM ... LOCK IN SHARE MODE : setzt gemeinsam genutztes (shared)
N¨achsten-Schl¨ussel-Sperren auf alle Index-Datens¨atze, die beim Lesen gefunden
werden.
• SELECT ... FROM ... FOR UPDATE : setzt exklusives N¨achsten-Schl¨ussel-Sp erren auf
alle Index-Datens¨atze, die beim Lesen gefunden werden.
• INSERT INTO ... VALUES (...) : setzt eine exklusive Sperre auf die eingef¨ugte Zeile.
Beachten Sie, dass diese Sperre kein N¨achsten-Schl¨ussel-Sperren ist und andere Be-
nutzer nicht davon abh¨alt, etwas in die L¨ucke vor der eingef¨ugten Zeile einzuf¨ugen.
Wenn ein Fehler wegen doppelter Schl¨usseleintr¨age auftritt, setzt dieser Befehl eine
gemeinsam genutzte (shared) Sperre auf den doppelten (Duplikat) Index-Datensatz.
• INSERT INTO T SELECT ... FROM S WHERE ... setzt eine exklusive Sperre (kein
N¨achsten-Schl¨ussel-Sperren) auf jede Zeile, die in T eingef¨ugt wurde. Sucht nach S in
Form von Konsistentem Lesen, aber setzt N¨achsten-Schl¨ussel-Sperren auf S, wenn
bei MySQL das Loggen angeschaltet ist. InnoDB muss in letzterem Fall Sperren
setzen, weil bei einer Roll-Forward-Wiederherstellung aus einer Datensicherung jedes
SQL-Statement auf genau dieselbe Weise ausgef¨uhrt werden muss, wie es urspr¨unglich
ausgef¨uhrt wurde.
• CREATE TABLE ... SELECT ... f¨uhrt SELECT als Konsistentes Lesen oder mit gemein-
sam genutzten (shared) Sperren aus, wie im vorherigen Punkt.
• REPLACE wird wie Einf¨ugen ausgef¨uhrt, wenn es keine Kollision auf einem eindeutigen
Schl¨ussel gibt. Ansonsten wird ein exklusives N¨achsten-Schl¨ussel-Sperren auf die Reihe
gesetzt, die aktualisiert werden muss.
• UPDATE ... SET ... WHERE ... setzt ein exklusives N¨achsten-Schl¨ussel-Sperren auf je-
den Datensatz, der beim Suchen gefunden wird.
Comentarios a estos manuales