Bagaimana untuk memastikan data adalah betul jika dua DML berlaku serentak dalam Django ORM?
P粉041881924
P粉041881924 2023-09-14 15:11:12
0
1
372

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

membalas semua(1)
P粉557957970

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()
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!