Будет ли транзакция Django останавливать другие соединения от выбора до ее завершения
В Django у меня есть таблица, содержащая записи, которые должны быть обработаны работниками celery.
Работает это так: рабочий захватывает из таблицы следующее X количество строк для пакетной обработки, а затем помечает их как обработанные. При использовании одного рабочего все было в порядке, но количество строк увеличилось, и я хотел бы добавить больше рабочих.
Меня беспокоит то, что другие работники будут хватать те же строки и пытаться их обработать.
При этом я реализовал следующую логику.
from django.db import models
class Row(models.Model):
processed = models.BooleanField(default=False)
worker = models.ForeignKey('Worker', on_delete=models.SET_NULL, null=True)
class Worker(models.Model):
name = models.CharField(max_length=100)
# these functions are all run in their own process from celery
def get_rows_to_process(worker):
batch_size = 10
with transaction.atomic():
rows = Row.objects.select_for_update().filter(processed=False, worker__isnull=True)[:batch_size]
if rows:
rows.update(worker=worker)
return rows
def process_rows_for_worker(worker):
rows = get_rows_to_process(worker)
for row in rows:
# Process the row here
row.processed = True
row.save()
Я хочу знать, будет ли этот блок transaction
препятствовать другим рабочим выбирать эти строки, пока не завершится выборка и последующее обновление? По сути, блокировка этих строк, чтобы другие рабочие не выполняли запрос select до завершения обновления.