Django事务请求失败但仍部分提交

时间:2011-11-19 18:52:21

标签: django transactions commit partial

当我提交表单时,我必须将两个对象保存到数据库中;但是如果第一次和第二次保存之间出现故障,我仍然会看到数据库中的第一个对象。

因为我在主要设置中启用了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事务?

(我也尝试过装饰器@ transaction.commit_on_success,但是obj1仍然存储在数据库中。)

1 个答案:

答案 0 :(得分:2)

这一切都取决于你使用的数据库,对于MySQL你需要你的表使用Innodb(直到最近才是默认值)。

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