phpMyAdmin
 sql >> Base de Dados >  >> Database Tools >> phpMyAdmin

Posso usar transações com ALTER TABLE?


Algumas declarações (principalmente DDL ) no MySQL causar um commit implícito antes eles são executados e não podem ser revertidos - como tal, isso impede que as alterações DML anteriores sejam revertidas também.

As instruções listadas nesta seção (e quaisquer sinônimos para elas) encerram implicitamente qualquer transação ativa na sessão atual, como se você tivesse feito um COMMIT antes de executar a instrução . A partir do MySQL 5.5.3, a maioria dessas instruções também causa um commit implícito após a execução; para obter detalhes adicionais, consulte o final desta seção.

Desde ALTER TABLE é uma das instruções afetadas, o lote SQL é efetivamente tratado 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;

A solução sugerida é manter DDL e DML separados . A documentação diz:

Você deve projetar suas transações [DML] para não incluir tais declarações [DDL]. Se você emitir uma instrução no início de uma transação que não pode ser revertida e, em seguida, outra instrução falhar, o efeito total da transação não poderá ser revertido nesses casos emitindo uma instrução ROLLBACK.