[MySQL] truncate はロールバックできない
想定通りにならなくてハマったのでメモ
どこでハマったか
truncate は一度テーブルを削除したあと同じテーブルを作り直す. これだけだと,直感的に「なるほど,truncate したテーブルがロールバックできないのだな」と思うのだけど, 実は truncate したテーブルだけでなく truncate を実行する以前に行われたすべての操作がロールバックできない.
これに気づけなくてハマった 😇
truncate は暗黙的にコミットする
MySQL の truncate を理解する上で押さえておかないといけないのは「truncate は暗黙的にコミットする」こと.
つまり,あるトランザクション内で truncate が実行されると,同じトランザクション内で truncate されたテーブルはもちろん,そうでないテーブルに対して行われたあらゆる操作がコミットされて,ロールバックできない.
たとえば,table1
で何かしらの変更をしてから table2
で truncate を実行すると,table1
と table2
の変更がコミットされ,どちらもロールバックできなくなる.
やっぱり公式ドキュメント
ここまで書いたことはすべて公式ドキュメントちゃんと書いてあった.困ったら公式ドキュメントを見ることをあたりまえにしたい.
MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.1.33 TRUNCATE TABLE 構文
ちなみに,Postgres は truncate をロールバックできるらしい