(MySQL 4.0) InnoDB: LOCK IN SHARE MODE
Martin Dunst
- datenbank
Hallo,
Ich habe begonnen, mit Locks und Transactions zu experimentieren.
Gegeben ist eine MySQL 4.0.12-Datenbank, die aus MyISAM-Tabellen besteht, einzige InnoDB-Tabelle sei 'locktest'.
Folgendes Test-Szenario wird von Client1 und Client2 zeitlich versetzt durchlaufen:
# Warten, wenn InnoBD-Record gesperrt
# ------------------------------
SET AUTOCOMMIT=1;
UPDATE locktest SET lockedby='Client1' WHERE type='planning';
# InnoBD-Record sperren
# ------------------------------
SET AUTOCOMMIT=0;
SELECT type FROM locktest WHERE type='planning' LOCK IN SHARE MODE;
# Queries auf MyISAM-Tabellen ausfuehren
# ------------------------------
INSERT INTO myisamtable (...) VALUES (...);
# InnoBD-Record freigeben
# ------------------------------
COMMIT;
SET AUTOCOMMIT=1;
UPDATE locktest SET lockedby='' WHERE type='planning';
In MySQL 5.0.27 funktioniert der Testfall wie geplant. Client2 wartet, bis Client1 das InnoDB-Record freigegeben hat und sperrt es dann seinerseits.
Das INSERT in die MyISAM-Tabelle 'myisamtable' wird sofort ausgeführt.
In MySQL 4.0.12 passiert folgendes:
Das Locking funktioniert nur dann, wenn das 'INSERT INTO myisamtable...' NICHT abgesetzt wird.
Wird es abgesetzt, dann geht offenbar auch der Lock flöten und Client2 wartet NICHT, bis Client1 das InnoDB-Record freigegeben hat.
Ich wäre dankbar für Hinweise,
1.) warum das so ist und
2.) wie man MySQL 4.0 dazu bringt, sich in diesem Fall so wie MySQL 5.0 zu verhalten.
lg
Martin Dunst
Hallo Martin,
Folgendes Test-Szenario wird von Client1 und Client2 zeitlich versetzt durchlaufen:
bitte stelle diese Versetzung auch dar.
Schreibe jeweils hin, wann auf welchem Client welche Aktion durchgeführt wird,
welches Ergebnis Du erhältst und welches Du erwartest.
In MySQL 4.0.12 passiert folgendes:
Das Locking funktioniert nur dann, wenn das 'INSERT INTO myisamtable...' NICHT abgesetzt wird.
Wird es abgesetzt, dann geht offenbar auch der Lock flöten und Client2 wartet NICHT, bis Client1 das InnoDB-Record freigegeben hat.Ich wäre dankbar für Hinweise,
1.) warum das so ist und
vermutlich ein Bug.
2.) wie man MySQL 4.0 dazu bringt, sich in diesem Fall so wie MySQL 5.0 zu verhalten.
ganz sicher durch das angemessene Update. MySQL 4.0 wird nicht mehr unterstützt
und sollte im Produktivbetrieb nicht mehr genutzt werden (eine ältere Version
sowieso nicht mehr). Wenn der Provider zum Update nicht bereit ist, zu einem
anderen umziehen.
Du solltest dabei berücksichtigen, dass ein Update von 4.0 (ggf. über 4.1) auf
5.0 sauber geplant sein will. Es gab viele Änderungen, auch inkompatible.
Freundliche Grüße
Vinzenz