Sommige uitspraken (met name DDL ) in MySQL een impliciete commit veroorzaken voor ze worden uitgevoerd en kunnen niet worden teruggedraaid - als zodanig voorkomt dit dat de eerdere DML-wijzigingen ook worden teruggedraaid.
De verklaringen in deze sectie (en eventuele synoniemen ervoor) beëindigen impliciet elke transactie die actief is in de huidige sessie, alsof u een COMMIT had gedaan voordat u de verklaring uitvoerde . Vanaf MySQL 5.5.3 veroorzaken de meeste van deze statements ook een impliciete commit na het uitvoeren; voor meer details, zie het einde van dit gedeelte.
Sinds ALTER TABLE
is een van de betrokken instructies, wordt de SQL-batch effectief behandeld 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;
De voorgestelde oplossing is om DDL en DML gescheiden te houden . De documentatie zegt:
U dient uw [DML]-transacties zodanig te ontwerpen dat dergelijke [DDL]-instructies niet zijn opgenomen. Als u vroeg in een transactie een verklaring afgeeft die niet kan worden teruggedraaid, en een andere verklaring later mislukt, kan het volledige effect van de transactie in dergelijke gevallen niet worden teruggedraaid door een ROLLBACK-verklaring af te geven.