Nehmen wir an wir wollen in einem Datensatz etwas ändern und danach einen weiteren löschen. Wir wollen aber den 2. nur dann löschen, wenn der erste auch wirklich geändert wurde. Das heißt sollte die Änderung aus irgendeinem Grund fehlschlagen, soll der 2. Datensatz keinesfalls gelöscht werden. Und genau hier kommen dann Transaktionen ins Spiel. Eine Transaktion definiert eine Befehlsreihenfolge, die nur ganz oder gar nicht ausgeführt wird. – Das ist in fast allen bekannten Realationalen-Datenbankmanagement-Systemen so. In diesem Artikel gehe ich jetzt im Weiteren speziell auf MariaDB ein, wobei das gesagte wohl auch fast eins zu eins für MySQL gelten sollte.
MariaDB stellt so wie MySQL verschiedenste Speicher-Engines zur Verfügung. Jede einzelne bietet gewisse Vorteile, einige haben aber auch den großen Nachteil, dass sie keine Transaktionen beherrschen. Für die hier gezeigten Beispiele werden alle Tabellen mit der Engine XtraDB erstellt, die das 1:1 Pendant zu InnoDB aus MySQL darstellt und intern in MariaDB sogar als InnoDB bezeichnet wird. So zeigt der SQL Befehlt
[SQL]SHOW TABLE STATUS FROM testdb;[/SQL]
InnoDB als Engine an. Also wenn wir wissen wollen, welche Engine eine Tabelle einer Datenbank hat, so erreichen wir das mit „SHOW TABLE STATUS FROM datenbankname“ wichtig ist es dabei zu beachten, dass man den Datenbanknamen übergibt und nicht den der Tabelle. Man bekommt dann eine schöne Übersicht über alle Tabellen der Datenbank und ihre Engines und weitere Einstellungen.
Will man Transaktionen verwenden und stellt fest, dass man als Speicher-Engine nicht InnoDB gewählt hat, so kann man in der Regel problemlos mit [SQL]ALTER TABLE testtable Engine=’InnoDB‘;[/SQL] die Engine umstellen.
Für die ersten Versuche habe ich eine ganz simple Testtabelle mit nur zwei Spalten angelegt. Die erste Spalte enthält eine Ganzzahl als id die automatisch bei jedem Eintrag um eins erhöht wird, die zweite Spalte enthält einen Alphanumerischen wert. Ich schreibe die Zahlen von eins beginnend als Worte in die Spalte.
[SQL]CREATE TABLE testtable(id int not null auto_increment primary key, value varchar(80));[/SQL]
und füge einmal zwei Zeilen ein:
[SQL]INSERT INTO testtable (value) VALUES(‚eins‘),(‚zwei‘);[/SQL]
Jetzt habe ich einfach einmal 2 Zeilen mit den Werten id=1, value=eins und id=2, value=zwei.
Zu Beginn habe ich gesagt eine Transaktion besteht aus einem Anweisungsblock der nur als ganzer oder gar nicht ausgeführt wird. Das heißt wir müssen den Beginn des Blockes mit [SQL]START TRANSACTION;[/SQL] beginnen und ihn danach mit [SQL]COMMIT;[/SQL] bestätigen oder mit [SQL]ROLLBACK;[/SQL] rückgängig machen. Aber nun der Reihe nach:
[SQL]START TRANSACTION;[/SQL]
[SQL]INSERT INTO testtable (value) VALUES(‚drei‘),(‚vier‘);[/SQL]
[SQL]COMMIT;[/SQL]
Diese drei Zeilen liefern mir wie gewünscht zwei neue Zeilen in der Datenbanktabelle.
[SQL]START TRANSACTION;[/SQL]
[SQL]INSERT INTO testtable (value) VALUES(‚fünf‘),(’sechs‘);[/SQL]
[SQL]ROLLBACK;[/SQL]
wenn ich mir jetzt alle Datensätze anzeigen lasse bekomme ich nur die ersten vier, die schon vor Beginn der Transaktion gespeichert waren. das heißt, das ROLLBACK hat verhindert, dass mein Datensatz tatsächlich gespeichert wurde.
In diesem einfachen Beispiel macht das natürlich noch nicht sehr viel Sinn, aber ich hoffe Sie können sich einmal grundsätzlich vorstellen, was Transaktionen sind und wie sie in MariaDB, bzw. MySQL ausgeführt werden.