[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 メーリングリストの案内