如果Django ORM中同时发生两个DML,如何确保数据正确?
P粉041881924
P粉041881924 2023-09-14 15:11:12
0
1
549

我的 Django 项目使用 mysqlInnoDB 引擎。我有一个如下所示的表,queue字段默认值为0

class Task(models.Model):
    task_id = models.CharField(max_length=32, primary_key=True)
    queue = models.IntegerField(default=0)

我有两个过程,一个是根据表中的最大队列插入一条记录。

max_queue = Task.objects.all().annotate(data=Max('queue')).values('data')
 queue_number = max_queue[0]['data'] + 1
 record = {'task_id':task_id, 'queue': queue_number}
 Task.objects.create(**record)

另一个过程是,对于queue不等于0的每条记录,将queue的值减1

query_list = Task.objects.filter(~Q(task_queue=0))
for query in query_list:
    Task.objects.filter(task_id=task_id).update(queue=query.queue - 1)

这里我关心的是这两个过程是否同时发生。例如,如果后面的过程要递减每个值。与此同时,第一个进程插入一个新值。在这种情况下,可能会出现一些错误。

我该怎么做?任何人有一个好主意,提前谢谢。

P粉041881924
P粉041881924

全部回复(1)
P粉557957970

您可以使用select_for_update() a> 为此,它将锁定您正在更新的记录,直到事务结束

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

with transaction.atomic():
    query_list = Task.objects.select_for_update().filter(~Q(queue=0))
    for query in query_list:
        query.queue -= 1
        query.save()
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板