1. 程式人生 > >樂觀鎖 和 悲觀鎖 的用法和區別

樂觀鎖 和 悲觀鎖 的用法和區別

隨著併發量的增加影響到我們資料時, 我們可以用MySQL的鎖技術

悲觀鎖

在執行資料庫操作的時候,會加一把鎖, 事物提交後釋放鎖 (期間如果有別的執行緒進行資料庫操作, 會阻塞, 如果一直佔用資源不釋放,其他執行緒就一直無法操作資料)

需配合MySQL的事物進行操作

使用方法

在資料庫操作語句中加入for update
如: select * from goods where id=1 for update

樂觀鎖

不會加鎖, 但是更新的時候會進行判斷, 判斷跟原始的資料一不一樣,返回受影響行數, 如果不一樣,他會返回受影響的行數為0, 如果一樣,會返回受影響的具體數量, 我們可以通過返回值,來採取對應的措施,比如回滾還是從新執行一遍

原理: 將 select 和 update 融為 一條語句, 並返回受影響的行數, 如果行數為0,說明別人已經把資料改了, 這個時候我們可以再嘗試重新獲取一下資料

使用方法(拿Django來說)

將 select 和 update 融為 一條語句
GoodsSKU.objects.filter(id=sku_id,stock=orgin_stock).update(stock=new_stock, sales=new_sales)

總結:

衝突比較少的時候, 使用樂觀鎖(沒有悲觀鎖那樣耗時的開銷)
衝突比較多的時候, 使用悲觀鎖(沒有樂觀鎖那麼多次的嘗試)