2011-11-19 51 views
2

當我提交表單時,我必須將兩個對象保存到數據庫;但是,如果在第一次和第二次保存之間出現故障,我仍會看到數據庫中的第一個對象。Django事務請求失敗,但仍部分提交

因爲我在主要設置中啓用了TransactionMiddleware,所以我希望(並且正在期待)請求失敗,以回滾我作爲此請求的結果所做的任何數據庫更新。

我的代碼如下:

def submit(request): 
    form1 = Form1(request.POST) 
    form2 = Form2(request.POST) 

    obj1 = form1.save() 

    # simulate an error 
    raise Exception('spam', 'eggs') 

    obj2 = form2.save(commit=False) 
    obj2.obj1 = obj1 
    form2.save() 

當我後來查詢數據庫,OBJ1存在。作爲失敗的結果,我如何獲得它來回滾obj1事務?

(我也試過把decorator @ transaction.commit_on_success,但obj1仍然存儲在數據庫中)。

+1

你使用了哪個數據庫? – second

回答

2

這一切都取決於你使用的數據庫,對於MySQL你需要你的表使用Innodb(直到最近它不是默認值)。

https://docs.djangoproject.com/en/dev/topics/db/transactions/

+0

正確 - 我使用的是MySQL,默認引擎是MyISAM。我通過設置默認存儲引擎爲innodb,並手動更改我所有表上的現有存儲引擎。但是,當請求失敗時,它仍然拒絕回滾obj1。 –