gpt4 book ai didi

php - 使用子查询进行多行更新的竞争条件

转载 作者:行者123 更新时间:2023-11-29 21:47:20 25 4
gpt4 key购买 nike

我查了半天也没找到答案。希望大家能给我一个。

与订单管理有关。我们的员工正在挑选订单。由于其他一些原因,我们的数据库有时会有点滞后。原始代码在第一个sql语句中选择了顺序,并在第二个sql语句中进行了更新。现在的问题是,两名员工都收到了订单,但每个人都应该收到不同的订单。因此选择和更新必须一步完成。

目标是动态选择表中的一行并更新它。但是选择过程包括应该更新的表。所以我不能做这样的事情

UPDATE table SET field = (SELECT field2 FROM table WHERE field = 0)

因为在过滤同一字段时设置表值是不可能的。另外,我正在使用 ORDER BY,这是多表更新中不允许的 ( enter link description here )。

我有这样的sql语句:

UPDATE t1 
INNER JOIN (
SELECT t3.order_id
FROM t1
LEFT JOIN t3 USING(order_id)
WHERE t1.error = 0
AND t1.status = 0
AND t1.user_id = 0
ORDER BY t1.express DESC, t1.time_insert
) AS t2 USING(order_id)
SET t1.user = ' . mysql_real_escape_string($user->getId()) . ', t1.time_update = NOW()

我以为我已经通过该声明解决了问题,但我们的员工仍在报告该问题。

有人知道是否仍然存在竞争条件或其他情况吗?

请不要告诉我修复数据库延迟。我将不得不为此重新设计整个数据库。 ;)

感谢您提供任何线索多普斯

最佳答案

我不确定您的较长查询与较短查询有何关系。但是,您可以将较短的实现为:

UPDATE table t CROSS JOIN
(SELECT field2 FROM table WHERE field = 0) t0
SET t.field = t0.field2;

关于php - 使用子查询进行多行更新的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34001658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com