一些带有PHP条件的MySql查询

一些带有PHP条件的MySql查询,php,race-condition,Php,Race Condition,背景: 我想匹配PHP Webapp中的用户。 当用户进入特定页面时,他将被放入虚拟池。 池的实现如下表所示: "search-table": id|userId|parameter 每个用户都在检查该表中是否还有其他用户准备匹配。(ready to match=相同参数)。检查是通过每x秒向我的PHP控制器发送一个AJAX请求来完成的。(AJAX请求会一直重复,直到找到匹配项,或者用户离开) 如果此查询返回有效的合作伙伴用户标识,则annother查询应执行对第二个表的插入 "matchin

背景: 我想匹配PHP Webapp中的用户。 当用户进入特定页面时,他将被放入虚拟池。 池的实现如下表所示:

"search-table": id|userId|parameter
每个用户都在检查该表中是否还有其他用户准备匹配。(ready to match=相同参数)。检查是通过每x秒向我的PHP控制器发送一个AJAX请求来完成的。(AJAX请求会一直重复,直到找到匹配项,或者用户离开)

如果此查询返回有效的合作伙伴用户标识,则annother查询应执行对第二个表的插入

"matching-table": id|firstUser|secondUser
插入后,应删除匹配用户的两个“搜索表”条目

如何保证不会有“同一用户的两个插入”,因为一些用户同时执行“检查”查询?->比赛条件

例如: UserA、userB和UserC在“搜索表”中。 -UserA:他的AJAX请求返回UserC -UserB:他的AJAX请求也返回userC

-UserA:使用firstUser=UserA和secondUser=UserC在“匹配表”中创建insert -UserB:也会在“匹配表”中创建一个insert,但是使用firstUser=UserB和secondUser=UserC -UserA:删除带有“UserA”和“userC”的“搜索表”条目

=>UserB应该不能创建插入,因为UserA已经选择了UserC

我怎么能意识到这一点? 我的实际代码是:

try
{   
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $dbh->beginTransaction();   

    $stmt =  $dbh->prepare("SELECT id FROM [...]");

    $stmt->bindParam(1, [...]);

    if($stmt->execute())
    {
        if($row = $stmt->fetch())
        {
            $matchID = $row['id'];
            //check if parameter/id is ok
            $checkD = $this->checkId($matchID);

            if($checkD)
            {
                return '-1';
            }
            else
            {      

                //Create entry in "matching-table"
                $stmt = $dbh->prepare("INSERT INTO [...]");

                $stmt->bindParam(1,[...]);
                $stmt->execute();

                //Delete Users from "serach-table"
                $stmt = $dbh->prepare("DELETE [...]");

                $stmt->bindParam(1,[...]);
                $stmt->execute();

                $dbh->commit();

                return $matchID;                            
            }
        }
        else
        {
            return '-1';
        }
    }
    else
    {
        return '-1';
    }       
} catch(Exception $e)
{
    $dbh->rollBack();
    return '-1';
}
当用户从“搜索表”中获得有效结果并希望创建“匹配表”条目时,如何“锁定”该表?这样其他用户就不能创建该条目了?

提示。在选择和插入之间插入睡眠(30)。这样,您就可以手动测试解决方案。的可能副本