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