0
我用這個查詢併發工人之間分配行:爲什麼這個查詢導致死鎖?
SET @update_id := 0;
UPDATE tablename
SET processed = -1, id = (SELECT @update_id := id)
WHERE processed = 0
LIMIT 1
SELECT @update_id as id;
有時它扔了僵局例外,我剛剛重新啓動它。但是,如果工人人數足夠多,幾乎每次都會陷入僵局,並陷入重試循環。如何正確地重寫它?
你肯定這應該正常工作?如果在select子查詢返回之後但在更新發生之前修改了行?我應該檢查返回值並重新啓動查詢如果0行被修改? – Poma
'AND processed = 0'應該阻止它。 是的,如果0行被修改或返回0,你應該重新啓動查詢。您可能需要增加檢查有任何一行'處理= 0',所以你不必無限循環。 另一種方法是設置的ProcessID,而不是-1,那麼它可能會簡化事情,你要處理的崩潰進程的任何情況。 '更新TN組加工=其中加工= 0極限1;從TN 選擇id其中加工= '' –
常規錯誤:1093您不能指定目標表「表名」的更新在FROM clause' – Poma