Назад к вопросам
Senior
2
Что произойдёт, если одновременно придут два запроса на резервацию? Как обеспечить консистентность?
Компании, где спрашивали
Яндекс
Ответ от нейросети
sobes.tech AI
Если одновременно придут два запроса на резервацию, без должной синхронизации может возникнуть состояние гонки, и оба запроса могут успешно зарезервировать один и тот же ресурс, что нарушит консистентность данных.
Чтобы этого избежать, можно использовать несколько подходов:
- Транзакции с блокировками на уровне базы данных — например, использовать
SELECT ... FOR UPDATE, чтобы заблокировать запись до завершения операции. - Оптимистичные блокировки — хранить версию записи и при обновлении проверять, что версия не изменилась с момента чтения.
- Механизмы очередей и сериализации запросов — обрабатывать запросы на резервацию последовательно.
- Использование атомарных операций — например, в 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("Ресурс уже зарезервирован")
Такой подход гарантирует, что два запроса не смогут одновременно зарезервировать один ресурс.