【问题标题】:Django transactions requests fail but still partially commitDjango 事务请求失败但仍部分提交
【发布时间】:2012-01-02 01:01:08
【问题描述】:

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

因为我在主要设置中启用了 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还是保存在数据库里)。

【问题讨论】:

    标签: django transactions commit partial


    【解决方案1】:

    这完全取决于您使用的数据库,对于 MySQL,您需要您的表使用 Innodb(直到最近还不是默认的)。

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

    【讨论】:

    • True - 我正在使用 MySQL,默认引擎是 MyISAM。我通过并将默认存储引擎设置为 innodb 以及手动更改我所有表上的现有存储引擎。但是,当请求失败时,它仍然拒绝回滚obj1。
    猜你喜欢
    • 2015-10-25
    • 2020-06-23
    • 2013-04-11
    • 1970-01-01
    • 2019-07-30
    • 2023-03-27
    • 1970-01-01
    • 2017-01-22
    • 2019-11-12
    相关资源
    最近更新 更多