Transaktionen werden im MySQL-Handbuch beschrieben.
Viel zu erklären gibt's da nicht. Es gibt zwei Möglichkeiten: setzt man "AUTOCOMMIT" auf 0, arbeitet man automatisch mit Transaktionen. Alle Änderungen werden nicht ausgeführt, bis ein explizites "COMMIT" kommt.
Beispiel:
set autocommit=0;
update ...
update ...
update ...
select <- zeigt den alten Zustand an, weil noch kein commit
commit;
select <- jetzt erst sind die Änderungen sichtbar
Zweite Möglichkeit, man kann für einen Block von Anweisungen autocommit deaktivieren.
Beispiel:
start transaction <- Beginn der Transaktion
update ...
update ...
update ...
commit <- Ende der Transaktion
update ... <- wird sofort ausgeführt und wartet nicht auf commit
ROLLBACK versetzt eine Tabelle in den Zustand vor der Transaktion zurück.
start transaction
delete ...
delete ...
delete ... <- angenommen hier tritt ein Fehler auf
rollback <- Änderungen werden rückgängig gemacht
select ... <- alle Einträge sind noch da
delete ... <- Vorsicht! DAS kann man nicht mehr rückgängig machen, weil außerhalb einer Transaktion.
BTW: Es wäre natürlich mal eine geniale Sache wenn jemand sich die Mühe machen würde, das Verhalten einer Transaktion in MySQL für myisam mit PHP zu simulieren.
Also Tabelle sperren, Backup ziehen und Log der Transaktion schreiben. Bei Erfolg Log verwerfen, bei Mißerfolg den Tabelleninhalt aus dem Log wiederherstellen. Danach Sperre wieder aufheben und Ergebnis der Transaktion in Log-File ausgeben.
Das wäre zwar alles andere als performant, aber falls man aus welchen Gründen auch immer MySQL mit Myisam verwenden MUSS, dann hätte man zumindest eine Notlösung für die seltenen Fälle in denen man auf eine Transaktion angewiesen ist. Meistens sind das ja irgendwelche Updates über mehrere Tabellen.
Geändert von Marcusson (26-02-2006 um 13:15 Uhr)
|