2014-01-17 33 views
1

從官方的Django文檔: https://docs.djangoproject.com/en/1.5/topics/db/transactions/#transaction-rollbackDjango:可能會回滾.save()調用?

a.save() # Succeeds, but may be undone by transaction rollback 
try: 
    b.save() # Could throw exception 
except IntegrityError: 
    transaction.rollback() 
c.save() # Succeeds, but a.save() may have been undone 

調用transaction.rollback()回滾整個事務。任何未提交的數據庫操作都將丟失。在這個例子中,a.save()所做的更改將會丟失,即使該操作本身沒有引發錯誤。

不保存一個提交?那麼它不應該受到回滾的影響,還是我錯了?

(可以設置參數提交=假的.save()函數。這表明,通常保存不提交)

+0

Django <1.6默認情況下自動提交是False。 https://docs.djangoproject.com/en/dev/topics/db/transactions/#autocommit-details。 (PS:你提到的文檔也列出了設置保存點和回滾的方法,但是你可能會讀到) – user1349663

+0

['save()']的'commit'關鍵字參數(https:// docs .djangoproject.com/en/1.5/topics/forms/modelforms /#the-save-method)方法是指對象是否保存到數據庫中。它不影響交易是否承諾。 – Alasdair

回答

0

你混淆單詞「提交」的兩層含義。

調用保存 - 在模型或表單上 - 確實會導致對數據庫的更新,因此從這個意義上說,它被提交到數據庫。但是,所有數據庫操作都發生在一個事務中:這些事務可以作爲一個塊提交或回滾。所以文檔是正確的:即使您撥打save(commit=True),這仍然是可以回滾的整體交易的一部分。

相關問題