Einige Aussagen (insbesondere DDL ) in MySQL verursachen eine implizite Übergabe vorher sie werden ausgeführt und können nicht rückgängig gemacht werden - Dadurch wird verhindert, dass auch die vorherigen DML-Änderungen rückgängig gemacht werden.
Die in diesem Abschnitt aufgeführten Anweisungen (und alle Synonyme dafür) beenden implizit jede in der aktuellen Sitzung aktive Transaktion, als ob Sie vor der Ausführung der Anweisung ein COMMIT ausgeführt hätten . Ab MySQL 5.5.3 verursachen die meisten dieser Anweisungen auch ein implizites Commit nach der Ausführung; Weitere Einzelheiten finden Sie am Ende dieses Abschnitts.
Seit ALTER TABLE
eine der betroffenen Anweisungen ist, wird der SQL-Batch effektiv behandelt als:
START TRANSACTION;
INSERT INTO `users` VALUES(NULL, 'User A', '[email protected]', '4', 'User A');
COMMIT; -- prevents ROLLBACK of insert(s), even if DDL fails
ALTER TABLE `users` CHANGE `level` `level` TINYINT(3) UNSIGNED NOT NULL;
Die vorgeschlagene Lösung besteht darin, DDL und DML getrennt zu halten . Die Dokumentation sagt:
Sie sollten Ihre [DML]-Transaktionen so gestalten, dass sie solche [DDL]-Anweisungen nicht enthalten. Wenn Sie zu Beginn einer Transaktion, die nicht rückgängig gemacht werden kann, eine Anweisung ausgeben und später eine weitere Anweisung fehlschlägt, kann in solchen Fällen die volle Wirkung der Transaktion nicht durch Ausgabe einer ROLLBACK-Anweisung rückgängig gemacht werden.