2015-11-30 23 views
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

回答

0

我不知道你的再查询与较短的一做。但是,您可以执行较短的一个:

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

感谢您的回答。较短的一个仅仅是更新将被过滤的字段不起作用的示例。与加入一起做。 loger声明完全符合我的意愿,但是当db滞后时,仍然有两名员工可以获得相同的订单。 – dops