今日は久しぶりにはまりました。
現在、
バッチ処理でデータベースからデータを一旦全て削除して、
新規に取り込み直す処理を作成しています。
※データベースはMySQLです。
TRUNCATE
で全削除!!
その後、
新規にデータを
INSERT!!
というような処理を書いたのですが、
トランザクションのテストとして、
わざとエラーを出してロールバックを行ってみたところ、
データは元に戻らず。。。。
コードはこんな感じです↓
・ ・ try{ //データベースをオープン $pdo = openPod(); //トランザクション開始 $ret = $pdo->beginTransaction(); ・ ・ try{ //データの削除 $query01 = "TRUNCATE テーブル名"; $stm01 = $pdo->prepare($query01); //実行する $stm01->execute(); //データの挿入 $query02 = "INSERT INTO テーブル名 ...."; $stm02 = $pdo->prepare($query02); //実行する $stm02->execute(); //コミットする $ret = $pdo->commit(); }catch(Exception $e){ //ロールバックする $ret = $pdo->rollBack(); echo "失敗しました。" . $e->getMessage(); } }catch (Exception $e) { echo "失敗しました。" . $e->getMessage(); } ・ ・ exit;
※実際には他にもいろいろとエラー処理を入れているので、
コードはもっとごちゃごちゃしています。
それで、
今更ながらに分かった事なんですが、
MySQLのTRUNCATE処理は、
トランザクション外で行われる為に、
ロールバックが出来ないとのこと。。。
ここに辿りつくまでに少し無駄に時間を取ってしまいました。
仕方ないので、
DELETE
でデータを削除するように変更すると、
今度はこちらの期待通りの動作をしてくれました。
この記事へのコメントはありません。