カテゴリー
SugiBlog Webエンジニアのためのお役立ちTips

MySQLトランザクションでROLLBACKが効かないケース

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可能な場合がある

参考: MySQL公式ドキュメント – ステートメントをロールバックできない場合

この記事がお役に立ちましたらシェアお願いします
998 views

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です