上一篇我們說了,如何在Django中進行事務操作,數據的原子性操作
涉及了事務操作,我們不得不考慮的另一個問題就是:並發操作
還是那個用戶轉賬的操作
我們使用事務操作解決的操作中途服務器宕機問題
但是,如果有兩條請求同時修改一條記錄該怎么辦?
我們可以使用select_for_update函數
select_for_update使用的是悲觀鎖
使用select_for_update內部執行的sql語句就是select...for update
具體用法:
models.UserInfo.objects.select_for_update().get()
注意:一定要讓select_for_update在同一個事務中
如果做的是金融的話建議還是使用悲觀鎖,這個會更加安全
關於樂觀鎖
樂觀鎖的出發點是:同一條數據很少會因為並發修改而產生沖突,適用於讀多寫少的操作,用以提高吞吐量
實現方式:
讀取一個字段,執行處理邏輯,當需要更新數據的時候,再次檢查該字段是否和第一次讀取的一致。如果一致,則更新數據。否則拒絕更新,重新讀取后再提交
樂觀鎖與悲觀鎖的比較
悲觀鎖可能會導致死鎖的發生
當A鎖定了a資源,需要b資源。而b資源又被B鎖定了,正在等待a資源。此時就導致了死鎖。我們一般通過設置超時時間來處理這個問題。
悲觀鎖可以有效的降低沖突后,重試的次數
樂觀鎖可以提高響應速度