MySQL-使用UDPATE&SELECT锁定行-PHP中的PDO-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

MySQL-使用UDPATE&SELECT锁定行-PHP中的PDO

我有以下查询:

$query = "UPDATE list SET locked=1, @id:=id WHERE worked=0 and is404=0 AND error=0 AND locked=0 LIMIT 1;SELECT * FROM list WHERE id=@id;";
$stmt  = $pdo->prepare($query);

if ($stmt->execute()) {
    $model = $stmt->fetch(PDO::FETCH_OBJ);
    if ( isset($model) && !isset($model->id) ) {
        echo json_encode(array('error' => -1, 'type' => 'No URL'));
        exit;
    }
}

我要完成的工作是使用称为“锁定”的字段之一来锁定行,从而避免在它们之间进行其他并行处理。

如果我在控制台中运行查询,则可以正常工作,并通过UPDATE中使用的@id返回锁定的行。

在php中使用PDO时会出现问题。该行被锁定,但SELECT语句不返回任何内容。

我的代码有什么问题?

展开
收起
几许相思几点泪 2019-12-29 20:57:31 5399 0
1 条回答
写回答
取消 提交回答
  • 几许相思几点泪

    这不是一个查询,而是两个查询

    $pdo->query("UPDATE list SET locked=1, @id:=id WHERE worked=0 and is404=0 AND error=0 AND locked=0 LIMIT 1");
    $stmt = $pdo->query("SELECT * FROM list WHERE id=@id");
    $model = $stmt->fetch(PDO::FETCH_OBJ);
    
    

    也就是说,您选择的锁定模型不可靠,两个并行进程可能返回相同的ID

    2019-12-29 20:57:49
    赞同 展开评论 打赏
问答排行榜
最热
最新
相关电子书
更多
好的 MySQL 兼容可以做到什么程度
立即下载
PostgresChina2018_张启程_为什么我们抛弃MongoDB和MySQL,选择PgSQL
立即下载
MySQL 5.7让优化更轻松
立即下载