Rumah > Soal Jawab > teks badan
Saya Django
项目使用 mysql
和 InnoDB
引擎。我有一个如下所示的表,queue
字段默认值为0
class Task(models.Model): task_id = models.CharField(max_length=32, primary_key=True) queue = models.IntegerField(default=0)
Saya mempunyai dua proses, satu ialah memasukkan rekod berdasarkan baris gilir maksimum dalam jadual.
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)
Satu lagi proses ialah menolak 1queue
不等于0的每条记录,将queue
daripada nilai
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)
Apa yang saya pentingkan di sini ialah sama ada kedua-dua proses ini berlaku serentak. Sebagai contoh, jika proses seterusnya ingin mengurangkan setiap nilai. Pada masa yang sama, proses pertama memasukkan nilai baru. Dalam kes ini, beberapa ralat mungkin berlaku.
Apa yang perlu saya lakukan? Sesiapa sahaja mempunyai idea yang baik, terima kasih terlebih dahulu.
P粉5579579702023-09-15 13:39:42
Anda boleh menggunakan select_for_update() a> untuk ini ia akan mengunci rekod yang anda sedang kemas kini sehingga akhir transaksi
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()