6

php/mysql Webアプリケーションで悲観的ロックを実装する方法は?

  1. web-user がページを開いて 1 つのデータセット (行) を編集します
  2. Web ユーザーが「ロック」ボタンをクリックすると、他のユーザーはこのデータセットを読み取ることはできますが、書き込むことはできなくなります
  3. web-user がいくつかの変更を行います (おそらく 1 ~ 30 分かかります)
  4. Web ユーザーが「保存」または「キャンセル」をクリックすると、「ロック」が解除されます

このシナリオの php/mysql に標準的な方法はありますか? Web ユーザーが「保存」/「キャンセル」をクリックせずに Internet Explorer を閉じた場合はどうなりますか?

4

3 に答える 3

10

テーブルに LOCKDATE および LOCKWHO フィールドを実装する必要があります。PHP/Mysql 以外の多くのアプリケーションでこれを行ってきましたが、常に同じ方法です。

ロックは TTL が経過すると終了するため、NOW と LOCKDATE を使用して日付の減算を行い、オブジェクトが 30 分または 1 時間以上ロックされているかどうかを確認できます。

もう 1 つの要因は、現在のユーザーがオブジェクトをロックしているユーザーであるかどうかを考慮することです。そのため、LOCKWHO も必要です。これは、データベースの user_id、PHP の session_id にすることができます。ただし、ユーザーを特定できるものにしてください。IP アドレスは適切な方法ではありません。

最後に、すべての LOCKDATE と LOCKWHO を単純にリセットする一括ロック解除機能を常に考えてください...

乾杯

于 2011-11-17T16:45:32.483 に答える
6

伝統的に、これはlocked適切にフラグが立てられたデータベース内のレコードのブール列で行われます。

ロックを解放しなければならないのは、この種のロックの機能であり、状況により、これが自然に発生しない場合があります (システムのクラッシュ、ユーザーの愚かさ、ネットワーク パケットのドロップなど)。これが、手動でロックを解除する方法を提供したり、レコードをロックできる時間に (おそらく cron ジョブを使用して) 時間制限を課したりする必要がある理由です。ブラウザがまだ開いている場合にレコードをロックしたままにするために、ある種の AJAX ポーリングを実装できますか? いずれにせよ、変更する前に、レコード内のデータがロックを取得したときと同じであることを確認するのが最善でしょう。

このタイプの動作のこの制限は、Web アプリケーションで特に一般的ですが、このアプローチを使用するすべてのものに当てはまります。たとえば、Sage Line 50 はバグです。マシン/アプリケーションがクラッシュした後、定期的にロック ファイルを削除する必要があります。

于 2011-11-17T16:43:41.823 に答える