2012-09-26 58 views
5

我在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 
+0

鎖定是基於存儲引擎 - 你有什麼用? –

+0

編輯後,它的InnoDB – Nyxynyx

+0

感謝(和9個字符去) –

回答

1

如果您UPDATE使用與使用頁面或行鎖的存儲引擎,查詢檢驗的行是寫鎖定,直到當前事務結束。使用LOCK IN SHARE MODE設置一個共享鎖,允許其他事務讀取的檢查的行而不是update or delete他們。 和這個查詢

UPDATE mytable SET status = 1 
WHERE status IS NULL 
ORDER BY timestamp DESC 
LIMIT 1 

因爲InnoDB的

SQL語句,我認爲它的工作原理是相同的處理過程中自動獲取鎖。