当我提交表单时,我必须将两个对象保存到数据库中;但是如果第一次和第二次保存之间出现故障,我仍然会看到数据库中的第一个对象。
因为我在主要设置中启用了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仍然存储在数据库中。)
答案 0 :(得分:2)
这一切都取决于你使用的数据库,对于MySQL你需要你的表使用Innodb(直到最近才是默认值)。
https://docs.djangoproject.com/en/dev/topics/db/transactions/