Angenommen, Sie verwenden die Standardisolationsebene
REPEATABLE READ
. Wenn Sie eine konsistente
Leseoperation ausführen (also eine normale
SELECT
-Anweisung), weist
InnoDB
Ihrer Transaktion einen Zeitpunkt zu,
an dem Ihre Anfrage die Datenbank sieht. Wenn eine andere
Transaktion nach diesem Zeitpunkt eine Zeile löscht und
committet, können Sie dies nicht sehen. Einfügungen und
Änderungen werden genauso behandelt.
Sie können Ihren Zeitpunkt aktualisieren, indem Sie Ihre
Transaktion committen und eine neue
SELECT
-Anfrage starten.
Dies bezeichnet man als Nebenläufigkeitssteuerung mit Multiversionierung.
User A User B SET AUTOCOMMIT=0; SET AUTOCOMMIT=0; time | SELECT * FROM t; | empty set | INSERT INTO t VALUES (1, 2); | v SELECT * FROM t; empty set COMMIT; SELECT * FROM t; empty set COMMIT; SELECT * FROM t; --------------------- | 1 | 2 | --------------------- 1 row in set
In diesem Beispiel sieht Benutzer A die von Benutzer B eingefügte Zeile erst dann, wenn sowohl B als auch A ihre Operationen committet haben, sodass der Zeitpunkt sich auf die Zeit nach dem Commit von B verschiebt.
Wenn Sie den „frischsten“ Zustand der Datenbank
sehen möchten, stellen Sie entweder die Isolationsebene
READ COMMITTED
oder einen Locking-Read ein:
SELECT * FROM t LOCK IN SHARE MODE;
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.