由於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;例2: (無主鍵,table lock)
select * from products where name='mouse' for update;例3: (主鍵不明確,table lock)
select * from products where id<>'3' for update;例4: (主鍵不明確,table lock)
select * from products where id like '3' for update;
樂觀所和悲觀鎖策略
悲觀鎖:在讀取資料時鎖住那幾行,其他對這幾行的更新需要等到悲觀鎖結束時才能繼續 。
樂觀所:讀取資料時不鎖,更新時檢查是否資料已經被更新過,如果是則取消當前更新,一般在悲觀鎖的等待時間過長而不能接受時我們才會選擇樂觀鎖。
悲觀鎖 樂觀鎖 行級鎖 表級鎖
更新丟失 新改的覆蓋先改的,開發中有三種方法解決 1 將事務級別提高到最高端別 transaction serializable 操作雙方都要提公升級別 查詢使用共享鎖 更新使用更新鎖 一方查詢,一方更新,共享鎖和更新鎖會衝突 當雙方更新鎖,出現死鎖,程式會自動回滾一方操作,從而避免更新丟失 2 悲...
悲觀鎖 樂觀鎖 行級鎖 表級鎖
更新丟失 新改的覆蓋先改的,開發中有三種方法解決 1 將事務級別提高到最高端別 transaction serializable 操作雙方都要提公升級別 查詢使用共享鎖 更新使用更新鎖 一方查詢,一方更新,共享鎖和更新鎖會衝突 當雙方更新鎖,出現死鎖,程式會自動回滾一方操作,從而避免更新丟失 2 悲...
悲觀鎖 樂觀鎖 行級鎖 表級鎖
更新丟失 新改的覆蓋先改的,開發中有三種方法解決 1 將事務級別提高到最高端別 transaction serializable 操作雙方都要提公升級別 查詢使用共享鎖 更新使用更新鎖 一方查詢,一方更新,共享鎖和更新鎖會衝突 當雙方更新鎖,出現死鎖,程式會自動回滾一方操作,從而避免更新丟失 2 悲...