【问题标题】:Django models: managing transactions when commit_manually is deprecatedDjango 模型:不推荐使用 commit_manually 时管理事务
【发布时间】:2015-06-08 11:00:04
【问题描述】:

我正在运行 Django 1.4.11。我以类似于以下代码的方式覆盖了 Django 模型的 save() 方法:

from django.db import models
from django.db import transaction

class MyModel(models.Model):
    # model definition

    @transaction.commit_manually
    def save(self, *args, **kwargs):
        try:
            super(self.__class__, self).save(*args, **kwargs)
            foo() # do_other_things
        except:
            transaction.rollback()
            raise
        else:
            transaction.commit()

当我运行我的代码时,有时我会在 Apache 日志中看到这条消息:

RemovedInDjango18Warning:commit_manually 已弃用,取而代之的是 设置自动提交。

如何使用 set_autocommit 实现相同的逻辑?

【问题讨论】:

标签: python django django-models overriding


【解决方案1】:

同样的逻辑应该是这样的:

from django.db import models
from django.db import transaction

class MyModel(models.Model):
    # model definition

    def save(self, *args, **kwargs):
        transaction.set_autocommit(False)
        try:
            super(MyModel, self).save(*args, **kwargs)
            foo() # do_other_things
        except:
            transaction.rollback()
            raise
        else:
            transaction.commit()
        finally:
            transaction.set_autocommit(True)

但是,这相当于使用 atomic() 装饰器:

from django.db import models
from django.db import transaction

class MyModel(models.Model):
    # model definition

    @transaction.atomic
    def save(self, *args, **kwargs):
        super(MyModel, self).save(*args, **kwargs)
        foo() # do_other_things

这将在成功的__exit__ 上提交事务,并在出现异常时回滚。

【讨论】:

  • 完美。因此,如果 foo() 或 save() 方法中的任何其他内容引发异常,则不会在超级 save() 的 DBMS 上提交。对吗?
  • 没错,除非异常被原子块捕获。
【解决方案2】:

对于您给出的示例,您可以使用transaction.atomic 。如果代码成功,整个事务将被提交。如果出现异常,更改将被回滚。

@transaction.atomic
def save(self, *args, **kwargs):
    super(self.__class__, self).save(*args, **kwargs)
    foo() # do_other_things

【讨论】:

    猜你喜欢
    • 2010-11-29
    • 2015-05-13
    • 1970-01-01
    • 2017-02-19
    • 2019-02-28
    • 2017-02-20
    • 2021-08-01
    • 1970-01-01
    • 2012-08-09
    相关资源
    最近更新 更多