Niektóre stwierdzenia (w szczególności DDL ) w MySQL powodować niejawne zatwierdzenie przed są wykonywane i nie można ich cofnąć - w związku z tym zapobiega to również cofnięciu wcześniejszych zmian DML.
Oświadczenia wymienione w tej sekcji (i wszelkie ich synonimy) domyślnie kończą każdą transakcję aktywną w bieżącej sesji, tak jakbyś wykonał COMMIT przed wykonaniem instrukcji . Od MySQL 5.5.3 większość z tych instrukcji powoduje również niejawne zatwierdzenie po wykonaniu; aby uzyskać dodatkowe informacje, zobacz koniec tej sekcji.
Od ALTER TABLE
jest jedną z instrukcji, których dotyczy problem, partia SQL jest efektywnie traktowana jako:
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;
Sugerowanym rozwiązaniem jest oddzielenie DDL i DML . dokumentacja mówi:
Powinieneś zaprojektować swoje transakcje [DML] tak, aby nie zawierały takich wyciągów [DDL]. Jeśli wydasz wyciąg na początku transakcji, którego nie można cofnąć, a później kolejne wyciągi nie powiedzie się, pełny efekt transakcji nie może zostać cofnięty w takich przypadkach poprzez wydanie wyciągu ROLLBACK.