> Будет ли конкуренция при выполнении периодического таска, который читает и обновляет записи в таблице? (Python)

Уровень: senior · Роль: backend · Язык: Python · Категория: Технические вопросы

Компании: HeadHunter

Стек: Python

> Пример ответа

Да, конкуренция (race condition) возможна, если периодический таск читает и обновляет записи в таблице без должной синхронизации. Например, при использовании многопоточности или нескольких воркеров (Celery, APScheduler) два экземпляра таска могут одновременно прочитать одну запись, изменить её в памяти и записать обратно, перезаписав изменения друг друга (lost update).

Как избежать:

  • Используйте атомарные операции на уровне БД (например, UPDATE ... SET counter = counter + 1 WHERE id = X).
  • Для сложной логики применяйте оптимистичную блокировку (версионирование строки) или пессимистичную (SELECT ... FOR UPDATE).
  • В Python с SQLAlchemy можно использовать with_for_update() для блокировки строки на время транзакции.

Пример с оптимистичной блокировкой:

PYTHON
# Модель с полем version
async def update_record(record_id, new_data):
async with session.begin():
record = await session.get(Record, record_id)
if record.version != current_version:
raise ConcurrentModificationError
# обновление полей
record.version += 1

Также убедитесь, что таск запускается только один раз (например, через @shared_task(unique=True) в Celery или блокировку в Redis).

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью