0
我现在已经查了半天,但没有找到任何答案。我希望任何人都可以给我一个。使用子查询进行多行更新时的竞争条件
它关于订单管理。我们的员工正在挑选订单。由于其他一些原因,我们的数据库时间稍微滞后一点。原始代码在第一个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()
我以为我已经解决了这种说法的问题,但我们的员工仍然repporting问题。
有没有人有一个想法,如果有可能还有任何竞争条件或其他什么?
而且请不要告诉我修复数据库延迟。我将不得不重新设计整个分贝。 ;)
感谢任何线索 DOPS
感谢您的回答。较短的一个仅仅是更新将被过滤的字段不起作用的示例。与加入一起做。 loger声明完全符合我的意愿,但是当db滞后时,仍然有两名员工可以获得相同的订单。 – dops