Některá prohlášení (zejména DDL ) v MySQL způsobit implicitní potvrzení před jsou provedeny a nelze je vrátit zpět - jako takové to zabraňuje tomu, aby byly vráceny zpět i předchozí změny DML.
Příkazy uvedené v této části (a všechna jejich synonyma) implicitně ukončují jakoukoli transakci aktivní v aktuální relaci, jako byste před provedením příkazu provedli COMMIT . Od verze MySQL 5.5.3 většina těchto příkazů také po provedení způsobí implicitní potvrzení; další podrobnosti naleznete na konci této části.
Od ALTER TABLE
je jedním z ovlivněných příkazů, s dávkou SQL se účinně zachází 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;
Navrhovaným řešením je ponechat DDL a DML oddělené . dokumentace říká:
Měli byste navrhnout své transakce [DML] tak, aby takové příkazy [DDL] nezahrnovaly. Pokud na začátku transakce vydáte příkaz, který nelze vrátit zpět, a později selže jiný příkaz, nelze v takových případech odvolat plný účinek transakce vydáním příkazu ROLLBACK.