1

ユーザーが同時に2つの呼び出しを行うのを止めたいです。同時に 2 つの呼び出しがあると、アプリケーションにバグが発生し、間違った情報が更新されるためです。ユーザーの最初のアクティビティを終了し、ユーザーが同時に2つの呼び出しを試みた場合にエラーを発生させたい.

すべてのユーザー アクティビティをテーブルに記録しています ->

テーブルフィード->

......................................................
id   ! user  !  value  !  start !  finished ! timestamp
......................................................
7    !  22   !  100000 !    ok  !    ok     ! -------- 
......................................................
6    !  22   !  251632 !    ok  !    ok     ! --------
......................................................
5    !  53   !  125469 !    ok  !    ok     ! --------
......................................................
4    !  20   !  458962 !    ok  !    ok     ! --------
......................................................
3    !  19   !  124587 !    ok  !    ok     ! --------
......................................................
2    !  17   !  321457 !    ok  !    ok     ! -------- 
......................................................

このようにデータを記録しています。

  • ユーザーアクティビティが開始されると、更新されます:ユーザー、値、およびOKとして開始
  • ユーザーがアクティビティを終了したときに更新します: OKとして終了しました

今、同じユーザーの2つのリクエストを同時にチェックして停止する方法が非常に混乱しています。

私はphpとmysqlを使用しています

ありがとう

4

3 に答える 3

3

データベースで、「alreadyInUse」のような列を作成し、ユーザーが電話をかけたときに true としてマークし、ユーザーが通話を終了したときに false としてマークします。他のユーザーを処理している間は、常に alreadyInUse が false であるかどうかを確認し、false である場合にのみ先に進みます。より良い結果を得るために、PHP でスレッドと同期を使用することをお勧めします。

于 2013-03-19T09:52:49.767 に答える
1

スレッドと同期を続行することをお勧めしますが、最初は同じ目的を果たし、メモリも節約できるため、追加の列は必要ないと思います。

于 2013-03-20T16:23:34.527 に答える
0

たとえば、更新ロック読み取りの選択を使用できます。

$mysqli->autocommit(FALSE);
$result = $mysqli->query("SELECT * FROM feed WHERE id = ? FOR UPDATE")->fetch_array();

//do stuff

$mysqli->commit();

または名前付きロック:

$result = $mysqli->query('SELECT GET_LOCK(?, 5) AS feedlock')->fetch_array();

if($result['feedlock'] != 1)
{
  //handle lock error or timeout
  return;
}

 //do stuff

$result = $mysqli->query('SELECT RELEASE_LOCK(?)')->fetch_array(); 
于 2013-03-19T10:06:11.187 に答える