php mysqlatomic'Select and Delete'在表上

时间:2018-07-07 08:30:07

标签: php mysql

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

类似的东西

<?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 个答案:

答案 0 :(得分:0)

原子性是数据库事务属性(ACID)之一,因此您需要确保数据库引擎支持事务。

在MySQL中,MyISAM不支持事务,您必须使用InnoDB。

如果使用的是InnoDB,有两种方法可以在PHP中为MySQL启动数据库事务

/* 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();