Senior
26
Что произойдёт, если одновременно придут два запроса на резервацию? Как обеспечить консистентность?
Сұралған компаниялар
Яндекс
AI-дан жауап
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("Ресурс уже зарезервирован")
Такой подход гарантирует, что два запроса не смогут одновременно зарезервировать один ресурс.