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

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

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

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

 

以下の様な処理で、

ある特定の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にすると処理が重くなるんで、

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

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

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

関連記事

最近の記事

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

Twitter

アーカイブ

PAGE TOP