我的 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()