gpt4 book ai didi

python - 如何使用 Django 设置 ATOMIC_REQUESTS?它没有按我的预期工作

转载 作者:行者123 更新时间:2023-12-01 06:32:53 35 4
gpt4 key购买 nike

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,
}
}

当我在 View 中引发错误时,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

非常感谢。

最佳答案

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

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

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

关于 ATOMIC_REQUESTS 的说明:

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

It works like this. Before calling a view function, Django starts a transaction. If the response is produced without problems, Django commits the transaction. If the view produces an exception, Django rolls back the transaction.

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

While the simplicity of this transaction model is appealing, it also makes it inefficient when traffic increases. Opening a transaction for every view has some overhead. The impact on performance depends on the query patterns of your application and on how well your database handles locking.

它警告您小心使用此选项,因为通过设置此选项,您的每个 View 调用都将在单个事务中,但您仍然应该注意性能(例如,关心表锁和行锁、关心外部 api 调用) )以及您将面临的实现(例如 this link )困难。

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

我强烈建议您阅读this section .

关于python - 如何使用 Django 设置 ATOMIC_REQUESTS?它没有按我的预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59807972/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com