Някои изрази (най-вече DDL ) в MySQL предизвиква имплицитен комит преди те се изпълняват и не могат да бъдат върнати назад - като такова това предотвратява и връщането на предишни промени в DML.
Изявленията, изброени в този раздел (и всички синоними за тях) имплицитно завършват всяка транзакция, активна в текущата сесия, сякаш сте направили COMMIT преди да изпълните оператора . От MySQL 5.5.3 повечето от тези оператори също причиняват имплицитен комит след изпълнение; за допълнителни подробности вижте края на този раздел.
Тъй като ALTER TABLE
е един от засегнатите изрази, SQL пакетът ефективно се третира като:
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;
Предложеното решение е да запазите DDL и DML разделени . документацията казва:
Трябва да проектирате вашите [DML] транзакции така, че да не включват такива [DDL] изрази. Ако издадете изявление в началото на транзакция, която не може да бъде върната назад, и след това друго изявление по-късно се провали, пълният ефект на транзакцията не може да бъде отменен в такива случаи чрез издаване на оператор ROLLBACK.