【问题标题】:MySQL - Locking a row using UDPATE&SELECT - PDO in phpMySQL - 使用 UDPATE&SELECT 锁定一行 - php 中的 PDO
【发布时间】:2020-04-17 23:27:25
【问题描述】:

我有以下疑问:

$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;
    }
}

我想要完成的是使用其中一个名为“locked”的字段来锁定一行,从而避免其他并行进程干扰它们。

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

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

我的代码有什么问题?

【问题讨论】:

    标签: php mysql pdo


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2016-01-14
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 2012-04-06
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      相关资源
      最近更新 更多