使用PHP在原子操作中选择并更新行
我有一个PHP脚本,它使用PDO连接到SQLite数据库。假设数据库如下所示(简化): 现在,假设有人使用访问此脚本。然后,脚本应在使用PHP在原子操作中选择并更新行,php,sqlite,concurrency,Php,Sqlite,Concurrency,我有一个PHP脚本,它使用PDO连接到SQLite数据库。假设数据库如下所示(简化): 现在,假设有人使用访问此脚本。然后,脚本应在B中找到第一行(最低的ID)的空值,并将ghi插入B 显然,我可以使用这样的东西(让我们假设我已经清理了GET变量b): 在我的情况下,它可能会在99.99999%的情况下正常工作。但是,如果两个用户同时访问脚本,则有可能出现并发问题。他们可以从选择中获得相同的行(ID=3) 语句,然后任何人都可以猜测哪个值将被另一个值覆盖 有没有简单的方法解决这个问题 只要用一句
B
中找到第一行(最低的ID
)的空值,并将ghi
插入B
显然,我可以使用这样的东西(让我们假设我已经清理了GET变量b
):
在我的情况下,它可能会在99.99999%的情况下正常工作。但是,如果两个用户同时访问脚本,则有可能出现并发问题。他们可以从选择中获得相同的行(ID=3
)
语句,然后任何人都可以猜测哪个值将被另一个值覆盖
有没有简单的方法解决这个问题 只要用一句话就可以了。子查询是您的朋友:
UPDATE table SET b = :b
WHERE id = (SELECT id FROM table AS t
WHERE t.b IS NULL OR t.b = ''
ORDER BY t.id
LIMIT 1)
及
$row = $db->query("SELECT * FROM table WHERE B IS NULL OR B=''")->fetch();
$stmt = $db->prepare("UPDATE table SET B=:b WHERE ID=:id");
$stmt->bindValue(":b", $b);
$stmt->bindValue(":id", $row['ID']);
$stmt->execute();
UPDATE table SET b = :b
WHERE id = (SELECT id FROM table AS t
WHERE t.b IS NULL OR t.b = ''
ORDER BY t.id
LIMIT 1)