- ベストアンサー
同一ユーザーが同時アクセスした時のトランザクション
- 同一ユーザーが同時アクセスした場合のトランザクション処理方法とは?
- PHPとMySQLでWEBアプリを作成中。複数人がログインしてデータの書き換えが発生するため、トランザクションを扱いたい。
- 同じアカウントのユーザーが別々のブラウザから同時にアクセスしても問題がないトランザクション処理の方法を知りたい。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
No1です。 そのPHPファイル1つの中でトランザクションを完結させるという前提ということでしょうか? でしたら、MySQLのDBをInnoDBで作成し、以下のような手順で行えば排他処理を実現できます。 1.start transactionを宣言 2.更新対象テーブルに対して、select ~ for update(もしくは、select ~ lock in share mode)でレコードロックをかける 3.そのレコードに対して何かしらのupdate等のメイン処理 4.commitし、トランザクション終了 InnoDB以外のトランザクションをサポートしてないエンジンを使用する場合、もしくは、複数のPHPファイル(複数のHTML)にまたがって処理を行いたい場合は、以下のような手順となります。 1.最初に更新対象となるレコードの値ををphpのセッションに保存 2.何らかの処理を実施 3.更新処理直前に、最初に保存した値をphpのセッションから取得、更新対象のデータを再度参照し、値が違っていたら更新処理を中断、同じであったら更新処理を実施 等のロジックがどうしても必要になります。 ※ちなみにですが、phpのセッションは、ブラウザや、ブラウザのタブ毎に必ず一意となるようになっているので、仮に1つのPCで複数のブラウザやタブを開いても、それらは、別なセッションとみなされます。 これで回答になってますでしょうか。
その他の回答 (1)
- SherlockHolmes2
- ベストアンサー率40% (175/429)
PHPには、sessionという概念がありますので、それを利用するのが一般的です。 以下に参考URLを貼ります。 url : http://c-brains.jp/blog/wsg/08/05/22-193020.php
補足
回答ありがとうございます。 セッションは既に取り入れているのですが、今回の問題にセッションを使ってどう対処するのでしょうか。 説明不足だったので今回の問題をもうちょっと詳しく記載します。 例えばユーザーがアクセス(アクセスA)してきてphpやmysqlの処理が行われている真っ最中に同じユーザーが別のブラウザでアクセス(アクセスB)してくるというごく短い時間でのことです。 1:アクセスAでユーザー情報を読み込んだ後、アクセスBがユーザー情報読み込む 2:アクセスAが変更されたユーザー情報を書き込んだ後、アクセスBが変更されたユーザー情報を書き込む なんかこう書いていて結局アクセスBの結果でいいのではないかという感じもしますが、問題が出てきそうなのでこういう問題の一般的な回避方法が知りたいのです。 つまり同一ユーザーの同時アクセスの排他処理がしたいということです。 真っ先に思いついたのはアクセスしたらすぐユーザー情報に現在処理中であるというフラグをデータベースに書き込んで、全処理が終わったらフラグを下げるという方法です。 でもこんなまわりくどい方法をみんなやっているのだろうかと疑問であります。 そこでトランザクションかロックで問題解決できるんではなかろうかと思っている次第です。
お礼
InnoDBを使っていまして、まさにずばりです。 ありがとうございました!