1

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

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

表格提要->

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

谢谢

4

3 回答 3

3

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

于 2013-03-19T09:52:49.767 回答
1

我是第二个建议继续线程和同步,但不要认为你需要一个额外的专栏,因为你的开始可以达到同样的目的,也可以为你节省一些内存。

于 2013-03-20T16:23:34.527 回答
0

您可以使用 select 进行更新锁定读取,例如:

$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 回答