Sobes.tech
Back to questions
Senior
1

Что произойдёт, если одновременно придут два запроса на резервацию? Как обеспечить консистентность?

Companies where asked
Яндекс

Answer from AI

sobes.tech AI

Если одновременно придут два запроса на резервацию, без должной синхронизации может возникнуть состояние гонки, и оба запроса могут успешно зарезервировать один и тот же ресурс, что нарушит консистентность данных.

Чтобы этого избежать, можно использовать несколько подходов:

  1. Транзакции с блокировками на уровне базы данных — например, использовать SELECT ... FOR UPDATE, чтобы заблокировать запись до завершения операции.
  2. Оптимистичные блокировки — хранить версию записи и при обновлении проверять, что версия не изменилась с момента чтения.
  3. Механизмы очередей и сериализации запросов — обрабатывать запросы на резервацию последовательно.
  4. Использование атомарных операций — например, в Redis можно использовать команды типа SETNX для установки значения только если ключ не существует.

Пример с транзакцией в Python с использованием SQLAlchemy:

from sqlalchemy import select, update
from sqlalchemy.orm import Session

with Session(engine) as session:
    with session.begin():
        reservation = session.execute(
            select(Reservation).where(Reservation.id == resource_id).with_for_update()
        ).scalar_one()
        if reservation.is_available:
            reservation.is_available = False
            session.commit()
        else:
            raise Exception("Ресурс уже зарезервирован")

Такой подход гарантирует, что два запроса не смогут одновременно зарезервировать один ресурс.