一部のステートメント(特に DDL )MySQLでは暗黙のコミットを引き起こします 前 それらは実行され、ロールバックできません> -そのため、これにより、以前のDML変更もロールバックされなくなります。
このセクションにリストされているステートメント(およびそれらの同義語)は、ステートメントを実行する前にCOMMITを実行したかのように、現在のセッションでアクティブなトランザクションを暗黙的に終了します。 。 MySQL 5.5.3以降、これらのステートメントのほとんどは、実行後に暗黙のコミットも引き起こします。詳細については、このセクションの最後を参照してください。
ALTER TABLE
以降 は影響を受けるステートメントの1つであり、SQLバッチは次のように効果的に扱われます。
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;
推奨される解決策は、DDLとDMLを分離しておく ことです。 。 ドキュメント 言う:
このような[DDL]ステートメントを含まないように[DML]トランザクションを設計する必要があります。トランザクションの早い段階でロールバックできないステートメントを発行し、後で別のステートメントが失敗した場合、そのような場合、ROLLBACKステートメントを発行してトランザクションの効果を完全にロールバックすることはできません。