Sobes.tech
Senior
26

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

Сұралған компаниялар
Яндекс

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("Ресурс уже зарезервирован")

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