1. 程式人生 > >【Django】Django如何保證併發操作資料一致性問題

【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``這樣的功能,還有一個比較簡單的辦法來解決這個問題。