phpMyAdmin
 sql >> Database >  >> Database Tools >> phpMyAdmin

Posso utilizzare le transazioni con ALTER TABLE?

Alcune affermazioni (in particolare DDL ) in MySQL causa un commit implicito prima vengono eseguiti e non possono essere ripristinati - in quanto tale, impedisce anche il rollback delle precedenti modifiche DML.

Le istruzioni elencate in questa sezione (ed eventuali loro sinonimi) concludono implicitamente qualsiasi transazione attiva nella sessione corrente, come se si avesse eseguito un COMMIT prima di eseguire l'istruzione . A partire da MySQL 5.5.3, la maggior parte di queste istruzioni causa anche un commit implicito dopo l'esecuzione; per ulteriori dettagli, vedere la fine di questa sezione.

Da ALTER TABLE è una delle istruzioni interessate, il batch SQL viene effettivamente trattato come:

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 soluzione suggerita è mantenere DDL e DML separati . La documentazione dice:

Dovresti progettare le tue transazioni [DML] in modo da non includere tali dichiarazioni [DDL]. Se si emette un'istruzione all'inizio di una transazione di cui non è possibile eseguire il rollback e in seguito un'altra dichiarazione non riesce, in questi casi non è possibile annullare l'intero effetto della transazione emettendo un'istruzione ROLLBACK.