sql >> Base de Datos >  >> Database Tools >> phpMyAdmin

¿Puedo usar transacciones con ALTER TABLE?

Algunas declaraciones (sobre todo DDL ) en MySQL causan una confirmación implícita antes se ejecutan y no se pueden deshacer - como tal, esto evita que los cambios DML anteriores también se reviertan.

Las declaraciones enumeradas en esta sección (y cualquier sinónimo de ellas) finalizan implícitamente cualquier transacción activa en la sesión actual, como si hubiera realizado un COMMIT antes de ejecutar la declaración . A partir de MySQL 5.5.3, la mayoría de estas declaraciones también provocan una confirmación implícita después de la ejecución; para obtener más detalles, consulte el final de esta sección.

Desde ALTER TABLE es una de las declaraciones afectadas, el lote de SQL se trata efectivamente como:

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 solución sugerida es mantener DDL y DML separados . La documentación dice:

Debe diseñar sus transacciones [DML] para que no incluyan dichas declaraciones [DDL]. Si emite una declaración al principio de una transacción que no se puede revertir, y luego falla otra declaración, el efecto total de la transacción no se puede revertir en tales casos emitiendo una declaración ROLLBACK.