2016-12-31 14 views
0

Webアプリケーションは、プロジェクトを持つユーザーで構成され、プロジェクトは単一のユーザーに属し、URIは:root/project/[pidになります。Webアプリケーションの共有リソースへの同時アクセスの回避

今私はミドルウェアを持っており、他のプロジェクトへのアクセスを制限しています。ユーザーが自分のプロジェクトを他のユーザーと共有できるWebアプリケーションの機能もありますが、複数のユーザーが1つの共有プロジェクトにアクセスできます。

問題は、project1がuser1とuser2によって共有されている場合、同じプロジェクトに同時にアクセスしたくないということです。 URI root/project/project1_idは両方でアクセスできますが、同時にアクセスすることはできません。

私は現在、どのようにこれを行うことができると考えていますが、私はいくつかのアイデアを持っていますが、これを行うための最良の方法または簡単な方法があるかどうかを知りたがっています。

データベース内のプロジェクトテーブルを変更して、ユーザーがプロジェクトWebページにアクセスするたびにtrueに設定され、Webページを終了するかセッションが終了するときに設定を解除するア​​クティブフラグを設定することを検討しています。

しかし、これが最善の方法であるかどうかはわかりません。

私はWebアプリケーションのフレームワークとしてlaravelを使用しています。したがって、そのフレームワーク内のソリューションは素晴らしいでしょう。

+0

1人のユーザーに制限したい理由は何ですか?あなたは同じページを編集する2人の人が何かを心配していますか? –

+0

あなたのアプローチはまともです。しかし、_un_lockingアクセスの何らかの方法も必要です。これは、ロック(lock_until)の有効期限によって処理できます。 Webユーザーがいつ「終了」したかを知ることは難しい問題です。そのため、ユーザーがファイルのロックを解除してもらえないため、有効期限が必要です。しかし、その責任をユーザーに押し付けたい場合は、そうすることができます。もう1つの選択肢は、保存にチェック・アンド・セット方式を使用し、2人で同時アクセスを許可し、その間に変更が加えられたときにエラーが発生することです。 –

+0

@willis、それはプロジェクトを編集することができるので、プロジェクトの同じ要素を同時に編集することができれば、醜い – Snedden27

答えて

0

私が問題に下記の解決策使用して終了:私は誰かが私が設定され、フロントエンドでプロジェクト

を更新evertimeアップデートを入手私のプロジェクトテーブルのupdated_atのタイムスタンプとupdate_by列を追加

を数秒ごとにプロジェクトテーブルをチェックする長いポーリング機能を設定します。

私が過去5秒以内にプロジェクトに更新がある場合、私はフロントエンドで更新されたプロジェクト全体をフェッチしました。

1

Store a version number with each project

誰かがプロジェクトで何かを編集し始めたら、現在のバージョン番号をブラウザに送ります。編集内容を保存するときは、バージョン番号をサーバーに送り返してください。バージョン番号が一致する場合は、変更を保存してバージョンを増やします。バージョン番号が一致しない場合は、他の誰かがプロジェクトを編集しています。ユーザーが編集中にサーバーを定期的に呼び出して、バージョン番号が変更されているかどうかを確認し、「別のユーザーがこのプロジェクトを変更しました」と表示します。誰かが何かを編集し始めるたびに何かをデータベースに保存することもできます。そのため、ある人物が一定時間内にプロジェクトの編集を開始すると、「Xはこのプロジェクトを編集しています。

私は、Web上で開始されたアクションが完了するかどうかを判断するのが難しいため、第2者が新しい編集を開始することを妨げるロックを持つよりも、この戦略を使用します。ユーザーが編集を開始しても気を散らしてブラウザを開いたままにすると、ロックがタイムアウトするまで、そのプロジェクトに対する他の編集はブロックされます。

+0

これは良いですが、私はチェックイン/チェックアウトまたはロックタイプのフラグを設定します。ユーザー1が編集を開始すると、そのフラグを有効期限のあるdbに設定します。 user2が編集ボタンの代わりにそれを見ると、 "user1はこのファイルを編集しています。$ DATE/TIMEまたはuser1が編集を完了するまでロックされています"。 user1s画面では、彼が働いている間にajax経由でロックを更新するか、保存/終了/再発行のためにリリースしてください – ivanivan

+0

これはうまくいくはずです。楽観的な戦略は、ユーザーが矛盾しない変更を並行して行うことを可能にする機会を与えます。たぶん2人のユーザーがページを編集していますが、別のセクションを変更している可能性があります。最初のユーザーに保存を許可してから、2番目のユーザーがまだ別のセクションに変更を加えている間に、その変更を2番目のユーザーのエディターにインポートすることができます。 –

関連する問題