Senior
62
¿Qué sucederá si dos solicitudes de reserva llegan al mismo tiempo? ¿Cómo garantizar la consistencia?
Empresas donde se preguntó
Яндекс
Respuesta de la IA
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("Ресурс уже зарезервирован")
Такой подход гарантирует, что два запроса не смогут одновременно зарезервировать один ресурс.