Wie kann sichergestellt werden, dass die Daten korrekt sind, wenn in Django ORM zwei DMLs gleichzeitig auftreten?
P粉041881924
P粉041881924 2023-09-14 15:11:12
0
1
543

Mein Django 项目使用 mysqlInnoDB 引擎。我有一个如下所示的表,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

abzuziehen
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粉041881924
P粉041881924

Antworte allen(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()
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!