• ベストアンサー

トランザクションの利用

はじめて質問させていただきます。 PHP4.4 + MYSQL5でinnoDBを利用したトランザクション処理の勉強をしたいのですが、オープンソースやフリーのスクリプトで参考になるようなものはないでしょうか。いろいろ見たのですがMYISAMがほとんどで・・。 トランザクション処理の概念は分かるのですが、いざPHPでその動作を実現しようとしても、どうやれば良いのかがわかりません。 BEGINで始まりCOMMITで終わるのは分かるのですが、PHPでどのように書けば良いのでしょう。 参考になるスクリプトやサイトがあれば教えていただきたいです。

  • MySQL
  • 回答数1
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • la_pure
  • ベストアンサー率72% (18/25)
回答No.1

こんにちわ。 確かに少ないですよね^^; pearのdb使っているという前提でのお話になりますが、参考URL一番簡単なサンプルになるかなと思います。 流れは autoCommit(false); query();(失敗したらrollback()) query();(失敗したらrollback()) query();(失敗したらrollback()) query();(失敗したらrollback()) commit(); となります。 pearのdbよりmdbのほうが推奨されている(らしい)ので、pear::dbを入れてないようでしたらpear::mdb入れると最近の人って感じになると思います! 参考)mdbを使ってみる. http://angelicwing.net/php_old/?n=3

参考URL:
http://dozo.matrix.jp/pear/index.php/PEAR/DB/autoCommit.html
begin96
質問者

お礼

ありがとうございます。 PEAR::MDB使うと簡単なんですね。 PHPも初心者なのでそちらのほうも同時に勉強しなければ。

関連するQ&A

  • トランザクション処理について

    質問させて下さい。 以下の処理を行なっております。 1. トランザクション処理開始 2. テーブルAからデータをDELETE 3. テーブルBへデータをINSERT 4. トランザクション処理終了 上記処理の場合の「TYPE=InnoDB」指定の仕方が不安です。 現在はロールバックの可能性のあるテーブルAのみ「TYPE=InnoDB」を指定しています。 その状態でコミットもうまくいっているのですが、テーブルBに「TYPE=InnoDB」を 指定しなくてもよいものなのでしょうか。 環境 MySql 4.0.24

    • ベストアンサー
    • MySQL
  • MySQLのトランザクションについて

    WEBアプリ上の、MySQLのトランザクションについて質問です。 トランザクションは、データの挿入に矛盾がない場合commitすることによって データの挿入等を確定する機構だとおもいますが、 この仕組みって、トランザクション中は作業対象のテーブルは実行中のクライアント以外 アクセスできなくなる(※つまりロック?がかかっている?)のでしょうか? そうじゃないと、意味がないですよね?やっぱり。。。 また仮にですが、例えばAというクライアントがWEBサイトにアクセス中に Bというクライアントが待ったく 同じ動作を同じタイミングでアクセスした場合ってどうなるのでしょうか? 実際、WEBアプリでそこまでの例外というか処理って行うものでしょうか? また、ちなみにMySQLの場合、 "START TRANSACTION" というSQL文だけでなく AUTOCOMMIT = 0 として、自動コミットをオフにしつつ beginという式で トランザクションを開始する方法があるようですが、実際はどちらの方が当たり前のほうほうなのでしょうか? 識者の方ご教授ください。

    • ベストアンサー
    • MySQL
  • 同一ユーザーが同時アクセスした時のトランザクション

    PHPとMySQLでWEBアプリを作っています。 複数の人がログインしてデータの書き換えが発生するので、トランザクションを扱いたいと考えています。 サイトや書籍を見て基礎はとりあえず頭に入ったのですが、自分の作っているアプリで一般的にどうやればいいのかピンときていません。 そこでいくつか疑問があるのですが、今回的を一つに絞って質問します。 質問 「同じアカウントのユーザーが別々のブラウザから同時にアクセスしてきても問題が無いようにする一般的なトランザクション処理の方法が知りたい」 現在既に出来ているアプリの流れが以下です。(かなり簡略化しています) <?php  始めにMySQLでユーザー情報の読み込み  MySQLでいろんな情報の読み込み  phpでいろんな処理  MySQLでいろんな情報の書き込み  (上記の一連の処理は何回も出てくる)  最後にMySQLでユーザー情報の書き込み ?> 書籍やサイトに載っているトランザクションの例だと、読み込みと書き込みの一連の流れが連続しているので単純にSTART TRANSACTIONしてCOMMITしている場合が多いです。 しかしこのアプリの場合ユーザー情報の読み込みと書き込みに間が空いているので、この間をSTART TRANSACTIONとCOMMITで挟む、というのはかなりおかしい気もします。 このような場合に同一アカウントからの同時アクセスでも整合性を保つにはどうやるのが一般的なのでしょうか。 根本的にphpプログラムとしてデザインが間違っているのかもしれませんが、あくまでMySQLのトランザクション処理での解決を目指している(もうプログラムはほぼ完成している)ので、MySQLのカテゴリで質問しました。でもそういう指摘もしてもらえるとありがたいです。 (ちなみにこのようなことはあくまでそういうアクセスをしてくる人のまれな状況のための対処であり、頻度としては高くないと思っていますがまずは最初の疑問としてあげました)

    • ベストアンサー
    • MySQL
  • トランザクション中に別のトランザクションは開始できますか?

    DBはサイベースを使っています。初心者です。 以下のような動作をしているシステムの一部を改造することになりました。 1)カーソルAオープン 2)トランザクション開始 3)フェッチ 4)1トランザクションでの処理数分終了済みでなければ、3)から繰り返し 5)commit/rollback 6)終了済みでなければ 2)から繰り返し 7)カーソルAクローズ 今回、3)でフェッチしたレコードのある項目をキーとして 別のテーブルを検索しなければならないのですが、 3)の後に、カーソルBオープンとフェッチのみを追加しただけでは問題があると思うのですが、同一プロセスから、トランザクション中に別のトランザクションを開始することは可能なのでしょうか? なお、このトランザクションでは、レコードの追加や削除は行いません。 どうぞよろしくお願いいたします。

  • MySQLのInnoDBテーブルについて

    MySQLのバージョンは4.1.13-ntです。 元々MyISAMテーブルを使用してたんですが、トランザクション機能を使いたいということでInnoDBテーブルに変えたところ、検索に凄く時間がかかるようになりました。データ件数は二百万件ぐらいです。MyISAMテーブル の時は数秒でかえってきたのが、InnoDBテーブルでは何分という結果になりました。 InnoDBは早いと聞いたのですが、データが大量になると遅くなるのでしょうか?ご教授お願い致します。

  • トランザクション処理について教えてください

    お世話になります まず、トランザクション処理の定義から 「関連する複数の処理を一つの処理単位としてまとめたもの。」 例えば 金融機関での入出金処理、入金処理は成功で、出金処理は失敗 となると、まずいことになります。それで、 この、トランザクション処理は 「すべて成功」か「すべて失敗」のいずれかであること が保証されることらしいのですが、 さて、これを実現する方法を教えてください。 ACCESSのVBを使っての話で、エクセルファイルの作成や更新も あります。 また、どういった所を調べればいいかのアドバイスだけでもありがたいです 何か Begin Transaction ~ End Transaction のような方法を取ると聞いたことがあるのですが。

  • トランザクションとlast_insert_id

    トランザクション中にinsertする予定のテーブル(未コミット)のauto_increment値を取得することはできるのでしょうか。 以下のような処理を期待しているのですが、hoge1テーブルのauto_increment値が取得できずに困っております。last_insert_id に関わらず、hoge1テーブルのauto_increment値が取得できる方法があれば教えてください。 (1) トランザクション開始 (2) $sql=" INSERT INTO hoge1(name) value('あああ'); "; (3) ( ロールバック ) (4) $key=mysql_insert_id(); (5) $sql2=" INSERT INTO hoge2(hoge1_primary,age) value($key,'20歳'); "; (6) ( ロールバック ) (7) コミット (8) トランザクション終了 よろしくお願いします。 環境: php5,mysql5 (InnoDB)

    • ベストアンサー
    • MySQL
  • トランザクションについて教えてください

    PHPとMysqlを利用しています。MySQL4.1.18です。 同じテーブルに2つ以上の値をINSERTする場合、 1つでもエラーがあればロールバックさせるということはできますでしょうか。 あらかじめ「id=1」の値を登録しておき、この場合1つめがエラーになるので 2つめも実行されないでほしいのですが、実行されてしまいます。 テーブルのタイプはInnoDBにしています。 どうぞよろしくお願いします。 以下を参考に作成しました。 http://oshiete.nikkeibp.co.jp/qa3065237.html $sql = "begin"; $rst = mysql_query($sql, $con); //1つめ $sql= "INSERT INTO T_test(id,name)values('1','山田')"; $rst = mysql_query($sql, $con); if(!$rst){$err="err";} //2つめ $sql= "INSERT INTO T_test(id,name)values('2','鈴木')"; $rst = mysql_query($sql, $con); if(!$rst){$err="err";} $sql = "commit"; $rst = mysql_query($sql, $con); if($err){ $sql = "rollback"; $rst = mysql_query($sql, $con); }

    • ベストアンサー
    • MySQL
  • insert1つの処理でもトランザクションは必要?

    お世話になります。 現在、MYSQLデータベースを使用したプログラムを書いており、 そこでトランザクションについて質問があります。 トランザクションとは、複数の処理がすべて成功した場合に正式な処理を実行(commit)、1つでも失敗した場合は元に戻す(rollback)というようなことかと思うのですが、 では、1つの処理のみの場合は、トランザクションを使用する必要はないのでしょうか? 例えば、 ・あるテーブルにデータをinsertしたい。 このような単一の処理を書く場合でも、 以下のようにトランザクションを使うべきでしょうか? $dsn = 'mysql:dbname=〇〇〇;host=〇〇〇;charset=utf8'; $user = 'user'; $pwd = 'pwd'; //DB接続 try { $pdo = new PDO($dsn, $user, $pwd); } catch (PDOException $e) { die('DB接続失敗'); } //トランザクション開始 $pdo->beginTransaction(); //INSERT try { $sql = 'INSERT into table (test1, test2, test3) VALUES (:a, :b, :c)'; $st= $pdo->prepare($sql); $ret = $st->execute(array( ':a' => $a, ':b' => $b, ':c' => $c, )); if (!$ret) { throw new Exception('INSERT 失敗'); } //commit $pdo->commit(); } catch (PDOException $e) { //rollback $pdo->rollBack(); } $pdo = null; ※前提として、テーブルを使用するユーザーは多数います。 ご存知の方、ご回答いただけるれば幸いです。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • トランザクションが効かない

    PHPでMySQLをやっています。 異なる2つのテーブルに同時にinsertをしようと思い、transactionを使って 片方がエラーならどちらにもinsertしないこと期待したのですが、 どうも効いてないみたいなんです・・・ mysql_query("begin transaction;") or $errStr= mysql_errno() . ": " . mysql_error(). "\n"; $sqlstr = "INSERT INTO table1 (id, name) VALUES ("aaaa", "山田");"; mysql_query($sqlstr) or $errStr= mysql_errno() . ": " . mysql_error(). "\n"; $sqlstr = "INSERT INTO table2 (id, name) VALUES ("bbbb", "佐藤");"; mysql_query($sqlstr) or $errStr= mysql_errno() . ": " . mysql_error(). "\n"; mysql_query("commit transaction;") or $errStr= mysql_errno() . ": " . mysql_error(). "\n"; ※table1には既に「id:aaaa name:鈴木」が入っています を実行して重複エラー 「1062: Duplicate entry 'aaaa' for key 1 」 が出たのですが、table2には「id:bbbb name:佐藤」が入ってしまいます。 もちろんtable1には「id:aaaa name:山田」は入りません。 どうすればトランザクションが効くようになるのでしょうか?

    • ベストアンサー
    • MySQL