2009-09-20 141 views
10

我有一個django項目,其中的數據庫值需要經常自行更新。有一個cronjob運行來更新數據庫中的這些值,但一些操作需要原子事務。有沒有人知道如何讓一個模型方法在django中成爲一個完整的事務而不需要通過視圖?Django交易管理

理想情況下,我希望能夠在方法開始時啓動一個事務,並在最後提交它,然後就可以從任何地方(視圖或cronjob)調用該方法保證該方法是原子的。

如果你知道如何做到這一點,我還需要知道,如果提交失敗(由於同時寫入或某物),交易將自動重新嘗試,或者如果我必須手動捕獲失敗異常並重新調用該方法。

謝謝。

回答

15

你看看Django的transaction docs?特別是@transaction.commit_on_successsource code)裝飾者。如果裝飾函數返回而不引發異常,它將提交事務。如果發生異常,它會進行回滾。

+5

是的,這是適合使用的東西。我認爲OP是令人擔憂的,因爲文檔只是將這些與視圖相結合,而不是模型方法,但是查看源代碼中沒有任何內容不會在視圖之外工作。 – 2009-09-20 15:54:56

+5

實際上該文檔的頁面上有一個註釋,「雖然下面的示例使用視圖函數作爲示例,但這些裝飾器也可以應用於非視圖函數。」 – 2009-09-20 15:58:02

+0

謝謝。你碰巧知道如果同時寫入嘗試會發生什麼?交易是否會重新嘗試,如果不是,它會拋出什麼? 謝謝! – So8res 2009-09-20 23:32:48