Mon Django
项目使用 mysql
和 InnoDB
引擎。我有一个如下所示的表,queue
字段默认值为0
class Task(models.Model): task_id = models.CharField(max_length=32, primary_key=True) queue = models.IntegerField(default=0)
J'ai deux processus, l'un consiste à insérer un enregistrement basé sur la file d'attente maximale dans la table.
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)
Un autre processus consiste à soustraire 1queue
不等于0的每条记录,将queue
de la valeur de
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)
Ce qui m'importe ici, c'est si ces deux processus se produisent en même temps. Par exemple, si le processus suivant souhaite décrémenter chaque valeur. Dans le même temps, le premier processus insère une nouvelle valeur. Dans ce cas, certaines erreurs peuvent survenir.
Que dois-je faire ? Quelqu'un a-t-il une bonne idée, merci d'avance.
Vous pouvez utiliser select_for_update() a> pour cela, cela verrouillera l'enregistrement que vous mettez à jour jusqu'à la fin de la transaction