php mysql原子“选择并删除”表

m3eecexj  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(252)

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

<?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查询(使其原子化)来实现这一点?如果没有,那么任何关于如何实现这个逻辑的建议都会很好,非常感谢;

u2nhd7ah

u2nhd7ah1#

原子性是数据库事务属性(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();

相关问题