如果Django ORM中同時發生兩個DML,如何確保資料正確?
P粉041881924
P粉041881924 2023-09-14 15:11:12
0
1
559

我的 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()
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板