phpMyAdmin
 sql >> Base de données >  >> Database Tools >> phpMyAdmin

Puis-je utiliser des transactions avec ALTER TABLE ?

Certaines déclarations (notamment DDL ) dans MySQL provoquer un commit implicite avant ils sont exécutés et ne peuvent pas être annulés - en tant que tel, cela empêche également les modifications DML précédentes d'être annulées.

Les instructions répertoriées dans cette section (et leurs synonymes) mettent fin implicitement à toute transaction active dans la session en cours, comme si vous aviez effectué un COMMIT avant d'exécuter l'instruction . Depuis MySQL 5.5.3, la plupart de ces instructions provoquent également un commit implicite après l'exécution; pour plus de détails, voir la fin de cette section.

Depuis ALTER TABLE est l'une des instructions affectées, le lot SQL est effectivement traité comme :

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;

La solution suggérée est de garder DDL et DML séparés . La documentation dit :

Vous devez concevoir vos transactions [DML] de manière à ne pas inclure de telles instructions [DDL]. Si vous émettez une instruction au début d'une transaction qui ne peut pas être annulée, puis qu'une autre instruction échoue ultérieurement, le plein effet de la transaction ne peut pas être annulé dans de tels cas en émettant une instruction ROLLBACK.