😕

[MySQL] truncate はロールバックできない

想定通りにならなくてハマったのでメモ


どこでハマったか

truncate は一度テーブルを削除したあと同じテーブルを作り直す. これだけだと,直感的に「なるほど,truncate したテーブルがロールバックできないのだな」と思うのだけど, 実は truncate したテーブルだけでなく truncate を実行する以前に行われたすべての操作がロールバックできない.

これに気づけなくてハマった 😇

truncate は暗黙的にコミットする

MySQL の truncate を理解する上で押さえておかないといけないのは「truncate は暗黙的にコミットする」こと.

つまり,あるトランザクション内で truncate が実行されると,同じトランザクション内で truncate されたテーブルはもちろん,そうでないテーブルに対して行われたあらゆる操作がコミットされて,ロールバックできない.

たとえば,table1 で何かしらの変更をしてから table2 で truncate を実行すると,table1table2 の変更がコミットされ,どちらもロールバックできなくなる.

やっぱり公式ドキュメント

ここまで書いたことはすべて公式ドキュメントちゃんと書いてあった.困ったら公式ドキュメントを見ることをあたりまえにしたい.

MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.1.33 TRUNCATE TABLE 構文

ちなみに,Postgres は truncate をロールバックできるらしい