Mit MySQLi lassen sich Transaktionsklammern nutzen, um einen konsistenten Datenbankzustand zu erzwingen. Im folgenden Fall werden zwei Abfragen an die Datenbank gestellt: einmal die Anzahl der Kunden und einmal den Gesamtrechnungsbetrag. Der Inhalt der Datenbank könnte sich zwischen beiden Abfragen ändern. Deshalb wird mit einer Transaktionsklammer sichergestellt, dass keine fremden Änderungen das Ergebnis beeinflussen. Der Einfachheit halber ist hier nur das objektorientierte Beispiel wiedergegeben:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?php $sql = new mysqli("localhost", "benutzer", "passwort", "demodatenbank"); if (mysqli_connect_errno()) { printf("Verbindungsproblem: %s\n", mysqli_connect_error()); exit(); } $sql->autocommit(FALSE); $sql->begin_transaction(); $kunden = $sql->query("SELECT COUNT(*) FROM kunde"); $anzahl_kunden = $kunden->fetch_row(); $kunden->close(); $rechnungen = $sql->query("SELECT SUM(betrag) FROM rechnung"); $betrag_rechnungen = $rechnungen->fetch_row(); $rechnungen->close(); $sql->query("INSERT INTO statistik (anzahl, betrag) VALUES ($anzahl_kunden[0], $betrag_rechnungen[0])"); if (!$sql->commit()) { print("Transaktion gescheitert\n"); $sql->rollback(); } $sql->close(); ?> |
Mit der Funktion autocommit()
wird das automatische Schreiben in die Datenbank ausgeschaltet beziehungsweise angeschaltet. Das automatische Schreiben wird ausgeschaltet, das heißt, es muss ein Commit ausgeführt werden, sonst werden niemals Daten in der Datenbank hinterlegt. Es würde automatisch ein Rollback durchgeführt werden. In dem konkreten Beispiel ist dieser Aufruf jedoch wirkungslos, da schon mit einer Transaktionsklammer gearbeitet wird.
Mit begin_transaction
wird die Transaktionsklammer geöffnet. Dann finden die Abfragen und auch die Änderung auf der Datenbank statt. Mit dem Aufruf der Funktion commit()
wird die Transaktionsklammer geschlossen. Auf das rollback()
könnte verzichtet werden, da bei einem fehlerhaften Commit immer auch ein Rollback ausgeführt wird. rollback()
kann verwendet werden, um künstlich einen Rollback zu verursachen und die Transaktionsklammer ohne commit()
zu verlassen.