2014-02-27 60 views
1

MySQL documentation表示SELECT FOR UPDATE設置IX鎖。 IX鎖意圖排他鎖,當它發出時意味着「事務T意圖在掃描行上設置X(獨佔)鎖」。這意味着,SELECT FOR UPDATE成功之前,它必須首先獲得IX和X.然後MySQL的術語說,這大約意向獨佔鎖:MySQL innodb select for update concurrency

意向鎖定

一種鎖適用於表級,使用以指示事務打算在表中的行上獲取什麼類型的鎖。不同的交易可以在同一張桌子上獲得不同種類的意向鎖,,但是第一個獲得意向獨佔(IX)鎖的表上的交易可以防止其他交易獲得表上的任何S或X鎖。相反,獲取表上意向共享(IS)鎖的第一個事務可防止其他事務獲取表上的任何X鎖。兩階段過程允許按順序解決鎖定請求,而不會阻止鎖定和相應的兼容操作。有關此鎖定機制的更多詳細信息,請參見第14.3.5.3節「InnoDB鎖定模式」。

另外IX和IX是兼容的(鎖類型兼容性矩陣),這意味着如果事務1發出IX並且在另一個併發事務之後發生IX,它將成功。

是否有可能在同一時刻發佈兩個併發IX,MySQL爲同一個表的兩個事務授予/獲取IX。或者,如果併發IX被髮布,MySQL在任何時候只授予一個IX。我認爲MySQL只授予其中的一個,即使在同一時間在MySQL端進行調用和觸發。編輯:基本上如果我概括我的問題:如果兩個(併發)的SQL語句鎖定行(例如更新,選擇更新,選擇鎖定共享模式,插入,刪除)來到MySQL在同一時間,我想MySQL會順序處理它們。只是想確定一下,我正在思考MySQL如何在內部工作。

回答

1

鎖定操作必須被序列化。在服務器的邏輯工作流程的納秒級別上,不存在「恰好在同一時刻發生多個鎖請求」的情況。即使存在,服務器的邏輯也會隨意將它們按順序排列並逐一授予它們。

一個非常聰明的下一代大規模並行服務器可能會發現,不同的鎖請求被保證永不互相干擾,並且真正並行處理它們。但就目前而言,沒有同步的東西。