MySQL と PHP で、更新を実行している人だけが特定のレコードに関する情報を表示できるようにする方法はありますか?
たとえば、あるユーザーがページをロードすると、更新が必要なレコードが表示されます。そのユーザーがこのレコードの更新を完了するまで、このページにアクセスする他のユーザーはこの特定のレコードを表示できません。
問題のデータ テーブルに列を追加することはお勧めしません。locks
情報を保持するための特別なテーブルを作成したい:
create table locks (
tablename varchar,
primarykey int,
userid int,
locktime datetime);
次に、次の原則を考慮してください。
SELECT ... FOR UPDATE
は機能せず、実際に最初のリクエストを実行してロックを実行した人物のユーザー ID を保持する必要があります。locks
、(MySQL のステートメントを使用して) テーブル全体LOCK
をロックして、同じ行をロックする際の同時実行を回避する必要があります。locktime
タイムアウトを短くするか、ユーザーが作業している限りリセットされるping (つまり AJAX) メカニズムを提供する必要があります。locktime
ロックされたレコードlocktime
ユーザーは、ロックを所有していて有効期限が切れていない限り、レコードに変更を保存できますtablename
もちろんサンプルでprimarykey
あり、必要に応じて調整する必要があります:-)PHPスクリプトの実行が終了するとすぐにデータベースへの接続が失われるため、誰かが編集ページを要求したときに(列を追加して)手動で行をロックする必要がありIsLocked
ます(プーリングなどにもかかわらず、スクリプトの実行は停止されるため、その接続は別のスクリプトに移動する可能性があるため、同じスレッドから再度ロックを解除することはできません)。
一定時間以上ロックされている行のロックを解除するために、たとえば cron によって開始される一種のロック解除スクリプトを作成することを忘れないでください。
「ロックされた」列をテーブルに追加し、ユーザーが編集フォームを呼び出したら、「ロックされた」db 値を user_id に設定し、保存後に false/null に戻します。ビューアクションで、ロックされた値を確認してください
locked
ステータスを設定する場所のような名前のフィールドを追加できます。lockedtime
ロックがアクティブな時間のタイムスタンプを保存する場所のようなフィールドも追加するかもしれません。それはあなたのニーズに依存します。
このネイティブを行う可能性もあります。お気に入り
SELECT * FROM table WHERE primarykey = x FOR UPDATE;