MySQL(マイエスキューエル)

MySQLのトランザクション処理

今日は久しぶりにはまりました。

 

現在、

バッチ処理でデータベースからデータを一旦全て削除して、

新規に取り込み直す処理を作成しています。
※データベースは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

でデータを削除するように変更すると、

今度はこちらの期待通りの動作をしてくれました。

この記事を書いている人
株式会社ディープ
名前足立拓也

メールアドレスadachi@deep-deep.jp

関連記事

最近の記事

  1. ドメインについて
  2. WP:WordPress(ワードプレス)
  3. URL設計(URLデザイン)
  4. URL「ディレクトリ名」と文字アンダースコア(_)とハイフン(-)
  5. SEO対策(外部ファイルの読み込み)
  6. URL リダイレクト
  7. インデックスされない
  8. 内部対策は必要?
  9. CMS(シーエムエス)
  10. SEO業者は必要?

Twitter

  • 個人で借りているサーバのIPアドレスが、なぜか「FortiGuard」のブラックリストに登録されてしまった。まっとうにサイト運用してたから、なんで登録されたかは不明。取り敢えず、「データベースから削除して」って依頼したから、すぐに… twitter.com/i/web/status/1…
    about 12時間 ago via Twitter Web App

アーカイブ

PAGE TOP