Django中管理並發操作


上一篇我們說了,如何在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資源。此時就導致了死鎖。我們一般通過設置超時時間來處理這個問題。

悲觀鎖可以有效的降低沖突后,重試的次數

樂觀鎖可以提高響應速度

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM