2011-04-16 96 views
3

我閱讀了關於交易管理的Django文檔中的章節。據我所知,只要調用TransactionMiddleware就開始交易。然後通過使用@commit_on_success,@commit_manually有可能控制交易結束。在Django開始的交易

我的問題:是否有可能控制交易開始,以及完全擺脫TransactionMiddleware。我擔心Django框架的許多部分實際上取決於TransactionMiddleware的存在,所以我不想打破它。我希望它可以用於除了那些屬於我明確指定的應用程序的所有視圖。最重要的是,我希望能夠完全控制某些視圖的交易行爲 - 從開始到結束。我應該採取什麼方法?有沒有外部應用程序,庫來幫助我?第一次數據庫命中發生時,是急於還是懶惰地創建事務?

回答

4
  1. 事務是使用第一個數據庫查詢創建的。

  2. TransactionMiddleware適用於類似於commit_on_success的所有視圖。沒有必要明確地添加它。 commit_on_success對於將此行爲從您在視圖中調用的特定函數中提供仍然有用。

  3. 支持嵌套事務。

那麼,爲什麼你需要控制交易的開始?如果您想僅回滾一部分更改,則應使用嵌套事務完成此操作。

下面是從我的代碼常見的情況:

@transaction.commit_manually 
def purchase(request, ...): 
    try: 
     ... # change some data 
     _purchase(request, *args, **kwargs) # process purchase optimistically 
    except PurchaseError, ex: # My own exception class for errors we know about 
     _log_purchase(request, ex) # Save error in DB 
     messages.error(ex.human_message()) 
     transaction.commit() # Save log entries 
    except: 
     transaction.rollback() 
     raise 
    else: 
     transaction.commit() 

@transaction.commit_on_success 
def _purchase(request, ...): 
    ... 
+0

我必須這樣做,因爲我想與明確設置的隔離級別開始交易。如果出現特定的異常,則沿着'IsolationLevelRequired'行,我希望能夠以更高的隔離級別重新啓動事務,比如說'SERIALIZABLE'。雖然這看起來比我預期的要好,但今天會看看。謝謝。 – julkiewicz 2011-04-16 15:53:22

+1

此外 - django/db/transaction.py有一個非常好的代碼文檔。這似乎與你所說的一致。 – julkiewicz 2011-04-16 22:30:25