mysql中select for update鎖表的問題

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

  2.   

  3. 舉個例子:   

  4.   

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

  6.   

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

  8.   

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

  10.   

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

  12.   

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

  14.   

  15. 例2: (無主鍵,table lock)   

  16.   

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

  18.   

  19. 例3: (主鍵不明確,table lock)   

  20.   

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

  22.   

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

  24.   

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

  26.   

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

  28.   

  29. 注2: 要測試鎖定的狀況,可以利用MySQL的Command Mode ,開二個視窗來做測試。 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章