Php 具有子查询的多行更新上的竞争条件

Php 具有子查询的多行更新上的竞争条件,php,mysql,Php,Mysql,我已经搜索了半天,没有找到任何答案。我希望有人能给我一个 它是关于订单管理的。我们的员工正在挑选订单。由于其他一些原因,我们的数据库有时会有点滞后。原始代码在第一条sql语句中选择了顺序,并在第二条sql语句中进行了更新。现在的问题是,两个员工都得到了订单,但每个人都应该得到一个不同的订单。因此,选择和更新必须在一个步骤中完成 目标是动态选择表中的一行并更新它。但是选择过程包括应该更新的表。所以我不能做这样的事 UPDATE table SET field = (SELECT field2 FR

我已经搜索了半天,没有找到任何答案。我希望有人能给我一个

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

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

UPDATE table SET field = (SELECT field2 FROM table WHERE field = 0)
因为无法在对同一字段进行筛选时设置tables值。此外,我还使用orderby,这是mutli表更新()中不允许的

我有这样一个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()
我以为我已经用那句话解决了问题,但我们的员工仍在报告这个问题

有人知道是否还有比赛条件或其他什么吗

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

谢谢你提供任何线索
dops

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

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

谢谢你的回答。较短的一个示例只是更新将被筛选的字段不起作用。使用join执行此操作确实有效。loger的声明正是我不想做的,但当我们的db滞后时,仍然有两名员工可以得到相同的订单。