我的 Django
项目使用 mysql
和 InnoDB
引擎。我有一个如下所示的表,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粉5579579702023-09-15 13:39:42
您可以使用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()