代碼示例:
使用 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
以上是悲觀鎖的實例, 而樂觀鎖與悲觀鎖是相對的, 不是在讀取這條數據的時候加鎖而是在更新這條數據的時候加鎖. 就相當於兩個管理員同時在修改一個公司職員的信息時, 悲觀鎖是不允許同時修改的, 而樂觀鎖, 他們可以同時修改, 並且以最先保存結果的人為最后的保存結果, 同時通知另一個管理員無法保存的事實.
拋開計算機的世界, 你喜歡哪種性格的人呢?悲觀?樂觀? 我想做人要樂觀, 做事要悲觀. 做事我們必須要把壞結果提前想到, 並且做出一些必要的措施, 您說呢?