如何通过同时进行两次呼叫来阻止同一用户

时间:2013-03-19 09:25:31

标签: php

我想阻止用户同时拨打两个电话。因为如果同时有两个调用它会在我的应用程序中创建错误并更新错误信息。我希望它完成用户的第一个活动,并在用户尝试同时进行两次调用时给出错误。

我正在记录表格中的所有用户活动 - >

Feed - >

......................................................
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     ! -------- 
......................................................

我正在以这种方式录制数据。

  • 当用户活动开始更新时:用户,值并启动 确定
  • 当用户完成活动时,它会更新:已完成,因为确定

现在我很困惑如何在同一个用户的同一时间检查和停止两个请求。

我正在使用php和mysql

感谢

3 个答案:

答案 0 :(得分:3)

在您的数据库中,创建一个类似“alreadyInUse”的列,在用户拨打电话时将其标记为true,并在用户完成时将其标记为false。在处理其他用户时,请始终检查yetInUse是否为false,如果为false,则只进一步操作。我建议你在PHP中使用线程和同步,以获得更好的结果。

答案 1 :(得分:1)

我是第二个建议继续进行线程和同步,但不要认为你需要一个额外的列,因为你的开始可以起到同样的作用,也会为你节省一些内存。

答案 2 :(得分:0)

您可以使用select for update锁定读取,例如:

$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();