【问题标题】:How should I use Django-setting ATOMIC_REQUESTS? It doesn't work as I expected我应该如何使用 Django 设置的 ATOMIC_REQUESTS?它不像我预期的那样工作
【发布时间】:2020-05-05 13:24:25
【问题描述】:

macOS、Django 1.11、mysql 5.7、

我想知道ATOMIC_REQUESTS 是如何工作的,我该如何使用它。

# some code in settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '127.0.0.1',
        'NAME': 'kma_dev',
        'USER': 'root',
        'PASSWORD': 'root',
        'ATOMIC_REQUEST': True,
    }
}

当我在视图中引发错误时,mysql 操作没有回滚。

# test raise Error in view like this⬇️⬇️


class StoreGroup(View):

    def get(self, request):
        s = Store.objects.first()
        s.name = s.name + 'ABC'
        s.save()
        raise ValueError

非常感谢。

【问题讨论】:

  • 你的设置有错别字。

标签: python mysql django settings


【解决方案1】:

首先,我想你需要好好学习保存点,如docs 中所述。

应用您的更改的原因是 s.save() 在引发异常之前实施。通过 s.save() 您添加一个保存点,并通过 Django 在原子事务中的默认行为(您可以阅读 django.db.transaction.Atomic 的代码,特别是 def __exit__(self): 部分)它提交事务中存在的最后一个保存点。

您可以在文档中找到更多详细信息和示例,例如如何回滚到特定保存点以及有关保存点、回滚和提交的更多详细信息。

关于 ATOMIC_REQUESTS 的说明:

Django 的默认行为是将 ATOMIC_REQUESTS 设置为 False。通过将 ATOMIC_REQUESTS 设置为 True,您将添加以下更改。通过文档:

它是这样工作的。在调用视图函数之前,Django 会启动一个事务。如果生成的响应没有问题,则 Django 提交事务。如果视图产生异常,Django 会回滚事务。

这意味着您将像这样更改默认行为,并且 Django 会警告您:

虽然这种交易模型的简单性很有吸引力,但它也会在流量增加时变得低效。为每个视图打开一个事务有一些开销。对性能的影响取决于应用程序的查询模式以及数据库处理锁定的能力。

它会警告您谨慎使用此选项,因为通过设置此选项,您的每个视图调用都将在单个事务中,但您仍应注意性能(例如,关心表和行锁,关心外部 api 调用) 和实施(例如this link)您将面临的困难。

顺便说一句,您可以通过@transaction.atomic 装饰器或使用with transaction.atomic(): 语句的一些代码行将此功能添加到视图或函数中。这使您可以在需要时使用原子事务。

我强烈推荐你阅读this section。

【讨论】:

  • 非常感谢!你能告诉我更多关于ATOMIC_REQUESTS的使用吗?将ATOMIC_REQUESTS 设置为True 或False 有什么区别?我想学习使用ATOMIC_REQUESTS。
  • 您需要的信息太多,所以我编辑了答案并添加了更多信息。 :D
  • 再次感谢您。其实在问这个问题之前,我已经看过Django文档的相关部分了。正如它所说,If the view produces an exception, Django rolls back the transaction.,但为什么我在问题中提到的情况没有回滚?在问题示例中,我设置了ATOMIC_REQUEST=True 并在视图中抛出了错误。为什么没有发生回滚?
猜你喜欢
  • 2012-06-13
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
  • 2016-03-07
  • 2013-08-01
  • 2022-01-11
  • 1970-01-01
  • 2012-07-13
相关资源
最近更新 更多