我正在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
,如果不更新代码的其他部分,则无法更改。
是否可以在提交事务之前为仅此事务启用脏读(之前提供新状态?还是我还能做些什么?
基于这个类似的问题和对这个答案的评论,您可以尝试使用两个具有不同隔离级别的数据库连接。
以下代码来自链接的答案:
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
(,然后让我们知道这是否解决了您的问题。