Php 当有两个请求时,处理课程上的有限时段

Php 当有两个请求时,处理课程上的有限时段,php,mysql,Php,Mysql,我正在为一位朋友写一页,人们可以在那里预定课程。所有课程的课时都有限 在PHP页面上,我将获得课程的免费时段(从mysql),检查是否有足够的空间进行预订,然后将数据推送到mysql 预订保存在会话中,当用户填写信息并确认预订时,应执行此代码,该代码验证并将所有这些信息保存到数据库中 当同时有两个请求时会发生什么情况?在我将数据推送到mysql之前,我如何保证空闲插槽保持空闲 我会这样检查 <?php $canBook = true; foreach ($_SESSION["bookin

我正在为一位朋友写一页,人们可以在那里预定课程。所有课程的课时都有限

在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
?>

这可能是个问题,还是永远不会发生?还是有更好的办法解决这个问题

谢谢,


Tim

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


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

Tim正是您需要解决的问题。取决于您的并发性,这可能有点过头了,不过您担心这一点还是不错的。祝你好运我认为不会有超过50个用户,所以我应该不在乎?@timia2109如果总共有50个用户,我会说不值得增加额外的复杂性