Heim > Fragen und Antworten > Hauptteil
Mein Django
项目使用 mysql
和 InnoDB
引擎。我有一个如下所示的表,queue
字段默认值为0
class Task(models.Model): task_id = models.CharField(max_length=32, primary_key=True) queue = models.IntegerField(default=0)
Ich habe zwei Prozesse: Der eine besteht darin, einen Datensatz basierend auf der maximalen Warteschlange in der Tabelle einzufügen.
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)
Ein weiterer Vorgang besteht darin, 1queue
不等于0的每条记录,将queue
vom Wert von
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)
Was mir hier wichtig ist, ist ob diese beiden Prozesse gleichzeitig ablaufen. Zum Beispiel, wenn der nachfolgende Prozess jeden Wert dekrementieren möchte. Gleichzeitig fügt der erste Prozess einen neuen Wert ein. In diesem Fall können einige Fehler auftreten.
Was soll ich tun? Hat jemand eine gute Idee, danke im Voraus.
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()