gpt4 book ai didi

django - 在 Django 中为单个事务启用脏读

转载 作者:行者123 更新时间:2023-12-05 02:15:47 24 4
gpt4 key购买 nike

我正在 Django 中构建一个 REST API,用户可以在其中为对象运行任务。我在下面创建了一个简单示例,其中我使用事务轻松回滚对象的状态以防任务失败。

from django.db import IntegrityError, transaction

def send_object(id):
obj = MyModel.objects.get(pk=id)
if obj.state != 'Created':
raise ValueError('Object not in state "Created"')
with transaction.atomic():
obj.state = 'Sending'
obj.save()

# send the object...

obj.state = 'Sent'
obj.save()

现在我希望对象的状态在任务运行时通过 API 对用户可见。由于在任务完成之前不会提交事务,因此用户只能看到任务前后的当前状态。

我需要某种交易,以防在任务期间发生系统故障/关闭并且对象卡在“正在发送”。必须重置状态,以便轻松重试任务。

隔离级别设置为READ COMMITTED,并且在不更新代码的其他部分的情况下无法更改。

我可以在事务提交之前使新状态可用(即启用脏读)吗?或者还有什么我可以做的吗?

最佳答案

基于 this similar questioncomments to this answer ,您可以尝试使用两个具有不同隔离级别的数据库连接。

以下代码来自链接的答案:

DATABASES = {
'default': {
'NAME': 'app_data',
'ENGINE': 'django.db.backends.postgresql',
'USER': 'postgres_user',
'PASSWORD': 's3krit',
},
'serializable': {
'NAME': 'app_data',
'ENGINE': 'django.db.backends.postgresl',
'USER': 'postgres_user',
'PASSWORD': 's3krit',
'OPTIONS': {
'isolation_level': psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE,
},
},
}

您可以更改它以满足您的需要(可以使用 READ UNCOMMITED 而不是 SERIALIZABLE)然后让我们知道这是否解决了您的问题。

关于django - 在 Django 中为单个事务启用脏读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51181293/

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