【Django】Django如何保證併發操作資料一致性問題
阿新 • • 發佈:2019-01-05
使用 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``這樣的功能,還有一個比較簡單的辦法來解決這個問題。