行級鎖和表級鎖, 樂觀所和悲觀鎖,溫故知新

2021-10-05 02:04:28 字數 804 閱讀 9622

由於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 悲...