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

时间:2018-09-11 10:44:50

标签: php sqlite concurrency

我有一个PHP脚本,该脚本使用PDO连接到SQLite数据库。假设数据库看起来像这样(简化):

ID     A    B
1      foo  bar
2      abc  xyz
3      def

现在,假设有人使用http://example.com/example.php?b=ghi访问此脚本。然后,脚本应在ID中找到具有空值的第一行(最低B)并将ghi插入B中。

很明显,我可以使用这样的东西(假设我已经对GET变量b进行了消毒):

$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();

就我而言,在所有情况下99.99999%都可以正常工作。但是,如果两个用户同时访问脚本,则可能会出现并发问题。他们可以从ID = 3获得同一行(SELECT) 语句,然后由任何人猜测哪个值将被另一个值覆盖。

是否有解决此问题的简便方法?

1 个答案:

答案 0 :(得分:1)

只需在一个语句中完成所有操作即可。子查询是您的朋友:

let element = this.elementRef.nativeElement;
element.querySelectorAll('.seconds'));