首页  >  问答  >  正文

如果Django ORM中同时发生两个DML,如何确保数据正确?

我的 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粉041881924P粉041881924371 天前496

全部回复(1)我来回复

  • P粉557957970
  • 取消回复