樂觀鎖 和 悲觀鎖 的用法和區別
阿新 • • 發佈:2018-12-30
隨著併發量的增加影響到我們資料時, 我們可以用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)
總結:
衝突比較少的時候, 使用樂觀鎖(沒有悲觀鎖那樣耗時的開銷)
衝突比較多的時候, 使用悲觀鎖(沒有樂觀鎖那麼多次的嘗試)