当有两个请求时,处理课程中有限的插槽

时间:2017-08-20 16:44:06

标签: php mysql

我正在为朋友写一个页面,人们可以在这里预订课程。所有课程都有限。

在PHP页面上,我将获得课程的免费插槽(来自mysql),检查是否有足够的空间进行预订,然后将数据推送到mysql。

预订保存在会话中,当用户填写信息并确认预订时,应执行此代码,验证并将所有这些代码保存到数据库中。

当同时有两个请求时会发生什么?在将数据推送到mysql之前,我如何保证免费插槽保持空闲状态?

我会这样检查

<?php
$canBook = true;

foreach ($_SESSION["booking"]->courseList as $booking) { //For all courses in the session
    if ($booking->getCourse()->getFreeSlots() < $booking->slots) { //Check if there are enough slots
        $canBook = false;
        break; //Not enough free space. Cancel
    }
}

if ($canBook) {
    //Is the data still vaild? (Think about other requests)
    $_SESSION["booking"]->save(); //Add booking to the database and reserve the slots
}
else
    showError(); //Show the user an error
?>

这可能是一个问题还是从未发生过?或者有更好的方法来解决这个问题吗?

谢谢,

1 个答案:

答案 0 :(得分:1)

如果在验证免费插槽后立即执行$ canBook的检查,那么对于常规网站来说,它应该足够了。

如果有并发请求的可能性(预期的活跃用户数量是多少?一秒钟内一个课程的请求数量是多少?),您可以在检查之前锁定您的记录。可以说,只在没有标志的情况下,在数据库中添加一个标志并继续进行验证和记录更新。如果有一个标志,脚本将进入休眠状态一秒钟,然后再检查一次。主线程将在保存过程后删除标志,并以这种方式将控制权转移到其他线程。