代码之家  ›  专栏  ›  技术社区  ›  Amir Rasti

php mysql原子表上的“select and delete”

  •  0
  • Amir Rasti  · 技术社区  · 6 年前

    我有一个类似队列的情况脚本,每个用户可以发布一个添加到队列中的请求,其他用户可以按照队列的顺序接受这些请求,但每个请求只能由一个用户接受。 但是如果我用两个查询来实现它,一个用于选择另一个用于删除

    像这样的东西

    <?php
    $sql = "SELECT id,CreationDate FROM `RandomQueue` order by CreationDate limit 1 ;";
    $result = $conn->query($sql);
    
    if ($result->num_rows == 1) {
        $row = $result->fetch_assoc();
    
        echo "this request is accepted".$row['id'];
    
        $sqlDel = "DELETE FROM `RandomQueue` WHERE id = {$row['id']}";
        $conn->query($sql);
    }
    ?>
    

    它将不起作用,因为可能会出现许多问题,例如两个用户接受一个请求等。(互斥问题)是否可以通过一个SQL查询(使其成为原子的)来实现这一点?如果没有,那么关于如何实现这个逻辑的任何建议都是好的,非常感谢;

    1 回复  |  直到 6 年前
        1
  •  0
  •   Peter    6 年前

    /* Begin a transaction, turning off autocommit */
    $dbh->beginTransaction();
    
    // your business logic goes here
    
    $dbh->commit();
    

    $mysqli->begin_transaction(MYSQLI_TRANS_START_READ_ONLY);
    // your business logic goes here
    $mysqli->commit();