我有一个这样的查询:
UPDATE persons SET processing = :processing WHERE processing IS NULL LIMIT 1
如果在执行此查询的确切时间调用脚本两次,该怎么办?它有可能只更新同一行两次吗?
> AFAIK,UPDATE
在表/行上持有独占锁,因此当一个UPDATE
在进程中时,另一个将被排队。为了提高安全性并强制实施此行为,您必须考虑在 Transaction Block
内运行 DML 操作。
另外,你真的需要在UPDATE
声明中加入这个LIMIT 1
吗?
在您的情况下,没有UPDATE
不会发生两次,因为请参阅WHERE
条件。在第一次更新中,processing
列为 NULL,因此将更新为传递的输入,但在第二次尝试中,将为此行false
条件WHERE processing IS NULL
,因此将跳过UPDATE
。
它将以原子方式执行两次。如果processing
更改为 not null,则队列中的第二个操作将不执行任何操作。
如果您正在考虑"rows_affected"值,它会说第二次受影响的 0 行,也就是说,除非您更改连接参数,告诉它返回找到的任何行而不是实际修改。
重新解释您的问题,如果您有一个包含多个processing
条目的表,其中多个为 NULL,那么不,它不会更新相同的条目,将设置其中两个。