Christian Seiler: MySQL 5.x : Update und Insert zusammenbinden?

Beitrag lesen

Hallo Tom,

Klar - nutze Transaktionen für's Schreiben (BEGIN, dann Deine INSERT/UPDATE/DELETE, dann COMMIT oder ROLLBACK bei Fehler), MySQL kann das (InnoDB vorausgestzt) schon eine ganze Weile.

Das hatte ich gelesen. http://dev.mysql.com/doc/refman/5.1/en/commit.html
Meine Datenbanken sind leider vollständig mit MyISAM gebaut. Da muss ich die erstmal umbauen. Aber ich habe noch im Gedächtnis, dass Relations mit MyISAM auch nicht möglich sind, aber mit InnoDB. Dann würde es sich wenigstens lohnen.

Du kannst FOREIGN KEYs auf MyISAM anlegen, aber sie haben keinen Effekt. Daher würde ich immer auf InnoDB setzen wollen, MyISAM hat eigentlich nur Nachteile gegenüber InnoDB - mit der kleinen Ausnahme, dass FULLTEXT-Indizes nur mit MyISAM funktionieren. Allerdings gibt's für Volltextsuchen auch Alternativen außerhalb der Datenbank, die man sich anschauen kann (Lucene et al).

verstehe ich das richtig, dass ich innerhalb einer Transaktion mehrere Commits anwenden kann und das Rollback dann immer nur das letzte wiederherstellen müsste? Oder muss für jedes Commit eine eigene Transaktion aufgemacht werden?

Nein. Es gibt zwar das Konzept von "Nested Transactions", aber MySQL unterstützt das grundsätzlich nicht.

Im Prinzip läuft das bei normalen Transaktionen so ab: Du startest eine Transaktion mit BEGIN oder START TRANSACTION. Dann kannst Du DML-Befehle ausführen (SELECT, INSERT, UPDATE, DELETE) oder Stored Procedures aufrufen die nur DML-Befehle verwenden. Damit verändest Du den Datenbestand. Diese Veränderung ist aber beim richtigen Isolation Level nur für die aktuelle Sitzung (= Verbindung) sichtbar und nicht für andere. Das heißt: Innerhalb der Sitzung liefert ein SELECT auf eine Tabelle auch vor dem COMMIT schon die geänderten Datensätze. Danach hast Du zwei Möglichkeiten:

1. Du rufst COMMIT auf und machst die Änderungen endgültig. Dann ist Deine Transaktion beendet, d.h. Du musst erst wieder eine neue Transaktion mit BEGIN starten.

2. Du rufst ROLLBACK auf und alle Änderungen werden rückgängig gemacht bzw. sehen für die Außenwelt so aus, als ob nie etwas passiert ist. Auch hier ist die Transaktion beendet, auch hier musst du erst wieder eine neue Transaktion mit BEGIN starten.

Ein ROLLBACK direkt nach einem COMMIT hat keinerlei Effekt. Ein DML-Statement direkt nach einem COMMIT oder ROLLBACK wird ohne (!) Transaktion direkt auf der Datenbank ausgeführt, ist also nur bezogen auf sich selbst atomar, nicht auf umliegende Befehle.

Viele Grüße,
Christian

--
Mein "Weblog" [RSS]
Using XSLT to create JSON output (Saxon-B 9.0 for Java)
»I don't believe you can call yourself a web developer until you've built an app that uses hyperlinks for deletion and have all your data deleted by a search bot.«
            -- Kommentar bei TDWTF