エンジニア足立のコーディング日記

エンジニア足立のコーディング日記

ブログトップへ >> 『2013年3月』の記事一覧

RSS MyISAMではロールバック(rollback)が出来ない!!

この記事を読むのに掛る所要時間: 320

 
データベースでデータの管理を行う際に、

 

データの整合性を保つためにトランザクション処理を入れてみようとした時の話です。

 

以下の様な処理で、

 

ある特定のIDをキーにして、

 

メインテーブ(tbl_main)からのデータ削除が正常に行われれば、

 

サブテーブル(tbl_sub)からも同じIDに紐付くデータを削除します。

 

そして、

 

サブテーブル(tbl_sub)からのデータ削除までが

 

正常に実行されればコミット

 

失敗すればロールバックを行うようにしています。
=======================================================================
//MySQLへの接続処理
if(!$my_con = @mysql_connect(“ホスト名”, “ユーザーID”, “パスワード”)) exit(“MySQLへの接続に失敗しました。”);
//データベースへの接続処理
if(!mysql_select_db(“データベース名”, $my_con)) exit(“データベースへの接続エラー”;

//トランザクション開始
$t_sql = “begin”;
mysql_query($t_sql, $my_con);

//SQLクエリ
$sql = sprintf(“delete from tbl_main where id=’%s'”, r($id));
//SQLを実行
$result01 = mysql_query($sql, $my_con);

if($result01){
//SQLクエリ
$sql = sprintf(“delete from tbl_sub where id=’%s'”, r($id));
//SQLを実行
$result02 = mysql_query($sql, $my_con);
}

if($result02){
//コミット
$t_sql = “commit”;
mysql_query($t_sql, $my_con);
}else{
//ロールバック
$t_sql = “rollback”;
mysql_query($t_sql, $my_con);
}
=======================================================================

これでいけるかと思い、

 

わざとエラーが出るようにしてテストをしてみると、

 

ロールバックされずにデータが完全に消えてしまいます。

 

調べてみると、

 

どうもストレージエンジンの問題のようでした。

 

トランザクション機能がサポートされているのは、

 

InnoDBというストレージエンジンを利用した場合で、

 

デフォルトで設定されているMyISAMというストレージエンジンでは、

 

使用できないとのこと!!

 

データベースをInnoDBに変更した覚えはないので、

 

恐らくストレージエンジンはMyISAMになっているのだろうと思い調べてみると、

 

やはりMyISAMでした!!

 

InnoDBにすると処理が重くなるんで、

 

ここはどうするべきか悩みどころです!!

このページのTOPへ戻る

著者情報

足立 拓也(あだち たくや)
1980年生まれ。
出身:兵庫県丹波市。
趣味:ボクシングジム通い。
特技:歴史の話しをすること。
一言:頑張って面白いブログを書きます。

月別アーカイブ

  •  

    • [—]2017 (9)
    • [+]2016 (49)
    • [+]2015 (86)
    • [+]2014 (81)
    • [+]2013 (104)
    • [+]2012 (78)
  • カテゴリー