[PHP-users 22992]Re: MYSQLトランザクション

SAITO Masaru daisaito @ lares.dti.ne.jp
2004年 8月 17日 (火) 06:40:17 JST


齋藤@横浜です。
# 男子団体体操、金メダル!おめでとう!!


rollbackするタイミングをちゃんと考えましょう。
実行エラーになるSQLを実行後にほかのSQLを実行しちゃダメでしょ。
その時点でトランザクションはabortしちゃうんだから。
# 眠いので未確認ですけど、、確かそうだったような。。
# 違ってたらごめんなさい。
失敗時点でrollbackして、次のSQLの実行をしないようにしないと、
autocommitモードで次のSQLが実行されちゃいますよ。


以下プログラム中のインラインコメントを見てよね。
# ところで、、if($error_flg == "1")   って何?
# 何で文字列で評価しなきゃいけないの?
# 一応、その規則に従いましたけど。。

202004/08/17 4:09:25 ごろ
Y osaosa <acosamu3 @ yahoo.co.jp> さんは
"[PHP-users 22991] Re: MYSQLトランザクション"の件について
以下のように書きました

> 下記ソースなんですが、一番目のSQL文はエラーになるように
> 作ってあります。
> (プライマリキーに重複値をわざと入れるように設定してあり
> ます。)
> 次のsql文は正常に実行できるものです。
> 本来、一番目のsql文でエラーが起これば、ロールバックして
> 、二番目のsql文も実行される前の状態になるはずなのに、な
> ぜか、ロールバックできずに実行されてしまいます。。。
> 
> // DBに接続
> $self_url = $_SERVER['PHP_SELF'];
> $con = mysql_connect("$db_host", "$db_id", "$db_pass");
> if(!$con){
>  $error_flg = "1";
>  exit;
> }
> else{ ; }
> if(!mysql_select_db("$db_name")){ array_push($e_list,'只
> 今大変混雑しておりま
> す。暫くしてからアクセスしなおして下さい。'); $error_flg =
> "1"; }else{ ; }
> mysql_query("BEGIN");
> 
> 
> //エラーになるSQL文
> $sql = "";
> $sql = "update faq_cate01 set ";
> $sql = $sql."cate_id = '12' ";
> $sql = $sql."where cate_id = '11';";
> $result01 = mysql_query($sql);

> if(!$result01){ $error_flg = "1"; }else{ ; }

1つ目、↑を↓に変える

 if(!$result01){
   $error_flg = "1";
   mysql_query("ROLLBACK");
  }else{  # このelseブロックは不要
   ; 
  }


> 
> //実行可能なSQL文
> $sql = "";
> $sql = "update ms_info set ";
> $sql = $sql."info_cate_id = '999' ";
> $sql = $sql."where info_id = '1';";

> $result02 = mysql_query($sql);
> if(!$result02){ $error_flg = "1"; }else{ ; }

2つ目、↑を↓に変える

 if($error_flg != "1"){
   $result02 = mysql_query($sql);
   if( !$result01){
     $error_flg = "1";
     mysql_query("ROLLBACK");
    }else{  # このelseブロックは不要
      ; 
    }
  }


> if($error_flg == "1"){

> mysql_query("ROLLBACK");
↑のrollbackは実行済みなので不要

> print ("error");

> exit;
↑のexitをするとmysql_closeが実行されないので削除

> }else{
> mysql_query("COMMIT");
ここに print("success");を入れる。
 
> }
> 
> mysql_close($con);
> print ("success");
↑このprint("success");は不要(↑のelseブロック内に移動した)

> exit;




それじゃ、、お休みなさい。。。


---
SAITO Masaru <daisaito @ lares.dti.ne.jp>




PHP-users メーリングリストの案内