MySQLトランザクションでROLLBACKが効かないケース
- MySQL
-
2024-01-30 - 更新:2025-09-05
MySQLのトランザクションは、処理の途中で失敗した場合に ROLLBACK(ロールバック)で元の状態に戻せる便利な仕組みです。
しかし「必ず元に戻せる」と思っていると落とし穴にはまります。
実は、MySQLには ROLLBACKが効かない(厳密には「元に戻せない」)SQL文 が存在します。
ROLLBACKできるSQL(DML)
一般的なデータ操作言語(DML)はトランザクションで管理でき、ROLLBACKも可能です。
- INSERT
- UPDATE
- DELETE
これらは通常通り、トランザクションの途中で ROLLBACK すれば元の状態に戻せます。
ROLLBACKできないSQL(DDL)
一方、スキーマを変更するようなデータ定義言語(DDL)は注意が必要です。
- CREATE
- DROP
- ALTER
- TRUNCATE
これらのDDL文を実行すると、MySQLでは 暗黙的に COMMIT が発生 します。そのため、実行後に ROLLBACK しても元に戻すことはできません。
つまり「ROLLBACKがエラーになる」のではなく、「DDLが実行された時点でトランザクションが確定してしまう」イメージです。
他のデータベースとの違い
これはMySQL固有の挙動です。
データベースによってはDDLもトランザクション管理下に置ける場合があります(例:PostgreSQLでは多くのDDLがトランザクション内でROLLBACK可能)。
MySQLを使う際には「DDLは必ず即時確定する」と覚えておくのが安全です。
まとめ
- INSERT / UPDATE / DELETE はトランザクションで管理でき、ROLLBACK可能
- CREATE / DROP / ALTER / TRUNCATE は実行時に自動コミットされ、ROLLBACK不可
- ROLLBACK自体がエラーになるわけではなく、「巻き戻せない」だけ
- PostgreSQLなど他のDBではDDLもROLLBACK可能な場合がある
この記事がお役に立ちましたらシェアお願いします

998 views