Zunächst einmal gibt es einen Fehler in Ihrer Implementierung. Wenn bei einer Abfrage ein Fehler auftritt, wird die aktuelle Transaktion automatisch zurückgesetzt und dann geschlossen. Wenn Sie also weiterhin Abfragen ausführen, befinden sie sich nicht in einer Transaktion (sie werden an die DB übertragen). Dann, wenn Sie Rollback
ausführen , es wird lautlos scheitern. Aus der MySQL-Dokumentation
:
Rolling back can be a slow operation that may occur implicitly without the user
having explicitly asked for it (for example, when an error occurs).
Der explizite Befehl ROLLBACK
sollte nur verwendet werden, wenn Sie in der Anwendung feststellen, dass Sie ein Rollback durchführen müssen (aus anderen Gründen als einem Abfragefehler). Wenn Sie beispielsweise Guthaben von einem Konto abbuchen, würden Sie explizit zurücksetzen, wenn Sie herausfanden, dass der Benutzer nicht über genügend Guthaben verfügt, um den Austausch abzuschließen...
Zum Testen der Transaktionen kopiere ich die Datenbank. Ich erstelle eine neue Datenbank und installiere eine Reihe von "Dummy-Daten". Dann führe ich alle Tests mit einem automatisierten Tool durch. Das Tool schreibt die Transaktionen tatsächlich fest, erzwingt Rollbacks und prüft, ob der erwartete Datenbankstatus während der Tests beibehalten wird. Da es schwieriger ist, den Endstatus einer Transaktion programmgesteuert zu ermitteln, wenn Sie eine unbekannte Eingabe für die Transaktion haben, wird das Testen von Live-Daten (oder sogar von Live-Daten) nicht einfach sein. Sie können es tun (und sollten), aber verlassen Sie sich nicht auf diese Ergebnisse, um festzustellen, ob Ihr System funktioniert. Verwenden Sie diese Ergebnisse, um neue Testfälle für den automatisierten Tester zu erstellen...