PHP MySQL 原子' Select and Delete '表上的



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

像这样的东西

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

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

最新更新