【Django】Django如何保證並發操作數據一致性問題


代碼示例:

使用 select for update 數據庫查詢

select ... for update 是數據庫層面上專門用來解決並發取數據后再修改的場景的,主流的關系數據庫 比如mysql、postgresql都支持這個功能, 新版的Django ORM甚至直接提供了這個功能的shortcut 。 關於它的更多介紹,你可以搜索你使用的數據庫的介紹文檔。

使用 select for update 后,我們的代碼可能會變成這樣:

復制代碼 代碼如下:

from django.db import transaction
class NotificationController(object):

    ... ...

    def mark_as_readed(self, notification_id):
        # 手動讓select for update和update語句發生在一個完整的事務里面
        with transaction.commit_on_success():
            # 使用select_for_update來保證並發請求同時只有一個請求在處理,其他的請求
            # 等待鎖釋放
            notification = Notification.objects.select_for_update().get(pk=notification_id)
            # 沒有必要重復標記一個已經讀過的通知
            if notication.has_readed:
                return

            notification.has_readed = True
            notification.save()
            # 在這里更新我們的計數器,嗯,我感覺好極了
            self.update_unread_count(-1)

除了使用``select for update``這樣的功能,還有一個比較簡單的辦法來解決這個問題。

 

附: http://www.cnblogs.com/wanself/archive/2012/12/17/2822185.html  Django-MySQL連接池

 

參考資料:

http://www.thinksaas.cn/topics/0/67/67994.html

https://segmentfault.com/q/1010000007427202

http://blog.csdn.net/ysjian_pingcx/article/details/51015988

http://codego.net/19104/

 

樂觀鎖、悲觀鎖:

Select For update語句淺析:  http://blog.csdn.net/liqfyiyi/article/details/7948282

 

JAVA-mysql悲觀鎖總結和實踐: http://chenzhou123520.iteye.com/blog/1860954   -- 占座類比

JAVA- mysql樂觀鎖總結和實踐: http://chenzhou123520.iteye.com/blog/1863407  -- SVN就是樂觀鎖

JAVA-未知驅動學習--數據庫中的悲觀鎖和樂觀鎖實例: http://blog.csdn.net/lovesummerforever/article/details/11285663 

 

以上是悲觀鎖的實例, 而樂觀鎖與悲觀鎖是相對的, 不是在讀取這條數據的時候加鎖而是在更新這條數據的時候加鎖. 就相當於兩個管理員同時在修改一個公司職員的信息時, 悲觀鎖是不允許同時修改的, 而樂觀鎖, 他們可以同時修改, 並且以最先保存結果的人為最后的保存結果, 同時通知另一個管理員無法保存的事實.

拋開計算機的世界, 你喜歡哪種性格的人呢?悲觀?樂觀? 我想做人要樂觀, 做事要悲觀. 做事我們必須要把壞結果提前想到, 並且做出一些必要的措施, 您說呢?

 


免責聲明!

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



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