我在MySQL中使用行鎖定(交易)創建一個作業隊列。使用的引擎是InnoDB。缺點鎖定
SQL查詢
START TRANSACTION;
SELECT *
FROM mytable
WHERE status IS NULL
ORDER BY timestamp DESC LIMIT 1
FOR UPDATE;
UPDATE mytable SET status = 1;
COMMIT;
根據這一webpage,
The problem with SELECT FOR UPDATE is that it usually creates a single synchronization point for all of the worker processes, and you see a lot of processes waiting for the locks to be released with COMMIT.
問:這是否意味着,當第一個查詢被執行,這需要一段時間才能完成e事務之前,當第二個類似查詢發生在第一個事務提交之前時,它將不得不等待它在查詢執行之前完成?如果這是真的,那麼我不明白爲什麼單行的行鎖定(我認爲)會影響下一個不需要讀取該鎖定行的事務查詢?
此外,可以在此問題得到解決(現在仍然達到的效果行鎖定,確實爲工作隊列)通過做UPDATE
,而不是交易?
UPDATE mytable SET status = 1
WHERE status IS NULL
ORDER BY timestamp DESC
LIMIT 1
鎖定是基於存儲引擎 - 你有什麼用? –
編輯後,它的InnoDB – Nyxynyx
感謝(和9個字符去) –