Будет ли транзакция 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 до завершения обновления.

Вернуться на верх