我正在为朋友写一个页面,人们可以在这里预订课程。所有课程都有限。
在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
?>
这可能是一个问题还是从未发生过?或者有更好的方法来解决这个问题吗?
谢谢,
添
答案 0 :(得分:1)
如果在验证免费插槽后立即执行$ canBook的检查,那么对于常规网站来说,它应该足够了。
如果有并发请求的可能性(预期的活跃用户数量是多少?一秒钟内一个课程的请求数量是多少?),您可以在检查之前锁定您的记录。可以说,只在没有标志的情况下,在数据库中添加一个标志并继续进行验证和记录更新。如果有一个标志,脚本将进入休眠状态一秒钟,然后再检查一次。主线程将在保存过程后删除标志,并以这种方式将控制权转移到其他线程。