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

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

0
この記事を書いている人
株式会社ディープ

名前ダッチ

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

Twitterはこちら >>

  • コメント: 0

関連記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

最近の記事

  1. WP:WordPress(ワードプレス)
  2. 色鉛筆
  3. WP:WordPress(ワードプレス)
  4. WP:WordPress(ワードプレス)
  5. WP:WordPress(ワードプレス)
  6. 文系と理系のメリットとデメリット
  7. 東京駅
  8. 残業
  9. プログラマーになるのに年齢は関係ある?
  10. 年収(収入)

Twitter

ダッチ@職業ブロガー兼プログラマー
@gatsu0000

ConoHa WING 2周年キャンペーン中

アーカイブ

PAGE TOP