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

Y osaosa acosamu3 @ yahoo.co.jp
2004年 8月 17日 (火) 16:03:37 JST


斉藤様、どうもありがとうございます!
ただ、下記スクリプトを試してみたのですが、
エラーとなるSQL文が逆になった場合、つまり、
一個目が正常に動き、二個目のがエラーになった場合、
一個目は反映されてしまいました。
これだと、どうもロールバックできてないみたいです。
何が悪いんでしょうか。。




--- SAITO Masaru <daisaito @ lares.dti.ne.jp> からのメッセ
ージ:
> 齋藤@横浜です。
> # 男子団体体操、金メダル!おめでとう!!
> 
> 
> 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 mailing list  PHP-users @ php.gr.jp
> http://ns1.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ -
> 質問する前にはこちらをお読みください
> http://www.php.gr.jp/php/novice.php3


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