Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP在原子操作中选择并更新行_Php_Sqlite_Concurrency - Fatal编程技术网

使用PHP在原子操作中选择并更新行

使用PHP在原子操作中选择并更新行,php,sqlite,concurrency,Php,Sqlite,Concurrency,我有一个PHP脚本,它使用PDO连接到SQLite数据库。假设数据库如下所示(简化): 现在,假设有人使用访问此脚本。然后,脚本应在B中找到第一行(最低的ID)的空值,并将ghi插入B 显然,我可以使用这样的东西(让我们假设我已经清理了GET变量b): 在我的情况下,它可能会在99.99999%的情况下正常工作。但是,如果两个用户同时访问脚本,则有可能出现并发问题。他们可以从选择中获得相同的行(ID=3) 语句,然后任何人都可以猜测哪个值将被另一个值覆盖 有没有简单的方法解决这个问题 只要用一句

我有一个PHP脚本,它使用PDO连接到SQLite数据库。假设数据库如下所示(简化):

现在,假设有人使用访问此脚本。然后,脚本应在
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)