mysql中select * for update鎖表的問題

先前介紹過SELECT ... FOR UPDATE的用法,不過鎖定(Lock)的資料是判別就得要注意一下了。由於InnoDB預設是Row-Level Lock,所以只有「明確」的指定主鍵,MySQL纔會執行Row lock (只鎖住被選取的資料例) ,否則MySQL將會執行Table Lock (將整個資料表單給鎖住)。 

舉個例子: 

假設有個表單products ,裏面有id跟name二個欄位,id是主鍵。 

例1: (明確指定主鍵,並且有此筆資料,row lock

SELECT * FROM products WHERE id='3' FOR UPDATE; 


例2: (明確指定主鍵,若查無此筆資料,無lock

SELECT * FROM products WHERE id='-1' FOR UPDATE; 

例3: (無主鍵,table lock

SELECT * FROM products WHERE name='Mouse' FOR UPDATE; 

例4: (主鍵不明確,table lock

SELECT * FROM products WHERE id<>'3' FOR UPDATE;

例5: (主鍵不明確,table lock

SELECT * FROM products WHERE id LIKE '3' FOR UPDATE; 


注1: FOR UPDATE僅適用於InnoDB,且必須在交易區塊(BEGIN/COMMIT)中才能生效。 

注2: 要測試鎖定的狀況,可以利用MySQL的Command Mode ,開二個視窗來做測試。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章