2015-11-30 103 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