• ベストアンサー

複数同時アクセスついて

おはようございます。 PHPでブラウザ上でデータベースの更新するページを作成しました。 今、問題があって、Aさんがデータを更新するため、作業をしていて、その間にBさんも作業をするためページを開きました。 Bさんが作業終了してデータを更新して、その後Aさんが更新するといった形で複数同時アクセス時にデータの書き換えでこまっています。 こういった場合、編集ページを排他処理にしたいのですがどのようなものがありますでしょうか? すみませんがお願い致します。 参考になるページもあればお願い致します。

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

  • ベストアンサー
noname#227796
noname#227796
回答No.1

やり方は色々あるかと思いますが。 例えば、「仕様」として、後から更新した人の勝ちにしてしまうのも一つの手ですし。 Web系の同時更新の場合、誰かが作業中に他の誰かには作業できないようにすることは難しいですね。 作業を途中で止めてしまったらどうするか、という問題もあるので。 やるのであれば、 (1)「作業開始」ボタンを設け、作業意志のある人が押さない限り、排他処理はしない。 (2)「作業開始」ボタンが押されたら、排他制御用テーブルに誰それさん(Aさんとしましょう)がいつ、何の作業を開始したかを記録する。 (3)作業中は、他の人が「作業開始」ボタンを押した場合、排他制御用テーブルを参照して、作業中であれば「Aさんがいついつより作業中です」というようなメッセージを出して、作業させない(排他制御する)。 (4)Aさんが作業を終了(例えば「作業終了」ボタンを押してもらうとか)したら、排他制御用テーブルから作業記録を削除する。 (5)もしも、Aさんが作業を行おうとして、排他制御用テーブルに自分の記録がなかったら、排他制御が解除された物として、それ以上の作業を行わせない。 (6)Aさんが作業を途中で投げ出したら、Aさんが次回ログインしたときに、「~の作業を中断しています。作業を継続しますか?」というようなメッセージを出してあげる。 作業を継続しない場合は、作業記録を削除。 作業を継続する場合は、作業画面に遷移。 (7)ただし、Aさんがいつまでも作業を投げ出しっぱなしにする可能性もあるので、排他制御を解除できる権限を持ったユーザーであれば、好きなときに作業記録を削除できるようにする。 こんな感じでしょうかね。 あとは、 ・排他制御を他人が解除できるタイミングをどの程度まで許すか ・一定時間以上作業が終了されていない場合は、作業を中断したと見なすか などの細かいところを詰めれば良いでしょう。 まあ、質問内容の機能がどこまでの排他制御を必要とするのかどうかわからないので、この流れで良いかわかりませんが。 私なら面倒なときは「後勝ちが仕様です」で済まします。 余程厳密な排他制御が必要でない限り、お客様にはその仕様でも納得してもらえているし、それで支障が出ることもそうそうありません。

TOKIO2003
質問者

お礼

丁寧に回答有難う御座います。 システム的とおもってましたが、ロジックでできそうですね。試してみます。 ありがとうございました。

関連するQ&A