2014-01-15 65 views
3

假設我有一個視圖函數foo,它調用模型方法barfoobar都用@method_decorator(transaction.commit_manually)裝飾。在返回之前,兩者總是做一個transaction.rollback()在Django中嵌套的手動提交事務

此嵌套回滾是否按預期工作,即調用foo時不會發生數據庫更改? (從我的測試中,它似乎工作,但我不確定,因爲我找不到任何有關適用於此案例的Django事務的權威性。注意我使用Django 1.4和PostgreSQL 9.1.4。)

回答

4

你必須小心在這裏,DB提交/回滾是連接水平,如果你有這樣的事情:

@transaction.commit_manually 
def foo(): 
    bar() 
    transaction.rollback() 

@transaction.commit_manually 
def bar() 
    #some db op 
    transaction.commit() 

#running 
foo() 

更改數據庫將COMMITED,你應該把@ transaction.commit_manually頂部級別的功能。在django 1.6 transaction.atomic裝飾被引入,它通常提供你在找什麼:

原子塊可以嵌套。在這種情況下,當一個內部塊成功完成,其效果仍然可以回來,如果一個異常在以後

外塊中引發另外你讓回滾應該OK(軋如果你想堅持1.4),只要提交只在最高級別,但最好在這種情況下將事務管理保持在一個級別(例如,引發異常並在foo()中處理它們)