2011-02-04 29 views
2

如何修改Django中的模型的行爲,以便在數據庫中執行自動鎖定和解鎖記錄以選擇它們,並使此行爲對於程序員是透明的?我已經知道如何鎖定和解鎖記錄(database record locking),但我們想知道這個代碼應該放在Django模型中的什麼位置。我希望它適用於all(),filter(),exclude()和其他查詢,並且解鎖應在save()以及不保存任何內容的查詢中調用。應該重寫哪些方法來實現Django中的自動鎖定和解鎖記錄

UPDATE:該應用程序有幾個線程可以同時運行兩個或更多的服務器,我想確保沒有來自公共數據庫的記錄將被多個線程處理。線程搜索一些記錄,然後通過套接字發送一些數據,最後更新這些記錄。換句話說,除了Django網站,還有服務器。

+0

似乎是一個非常奇怪的設計的Web應用程序。你介意解釋爲什麼MVCC不適合你嗎? – 2011-02-04 19:07:47

回答

2

你會想在模型__init__();這可以通過繼承相當簡單地實現。該模型的Manager將爲該模型實例化一個QuerySet,只要將檢索到的模型添加到查詢_result_cache[]或查詢的iterator()被調用時,就會獲得鎖定。當然,如果模型沒有相關聯的pk,那麼您必須確保您放棄了鎖定爭用。

如果您不想進行數據庫級鎖定,您可以查看Django-cachebot。它處理模型失效,但最重要的是它可以將模型記錄保存在線程的通用存儲中,因此您可以實現模型鎖定狀態並將其推送到存儲並由其他線程查詢。

我也有這種衝動給你一個奇怪的問題大ups。我不會在家裏嘗試這個,所以我真誠地希望你知道你在做什麼!