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