2017-01-22 5 views
1

Я работаю на платформе MarketPlace с резервированием. Есть специалисты, которые создают возможности. Доступность создается с периодами, например, с 8:00 до 17:00. Это период, который сохраняется в mongodb. Заказчик выбирает период 1 час. (Календарь для клиента генерируется динамически с периодом 1 час), например: в период с 8:00 до 17:00, период: 8: 00-9: 00:00, 9:00 am 10:00 и т. Д.Модель параллелизма mongodb doctrine symfony

поэтому невозможно, чтобы 2 клиента одновременно резервировали один и тот же период.

Когда клиент выбирает период и нажимает кнопку «книга», объект резервирования сохраняется в сеансе. Клиент покупает эту бронь и после того, как объект бронирования будет сохранен в коллекции резервирования.

Как сделать для «блокировки» периода выбора по первому клиенту и предотвратить второй клиента, который хочет зарезервировать тот же период?

И как я могу исправить таймер на 10 минут, а если нет оплаты за период «доступности», разблокировать этот период в календаре? Как создать хронометр, синхронизированный с сервером, и перенаправить на главную страницу при истечении времени ожидания? Должен ли я создать временную коллекцию с резервированием? Или сохранить резервирование объекта в моей коллекции? Бронирование со статусом «в процессе»?

Я использую symfony 3 и mongodb с учением.

спасибо.

ответ

1

Как сделать для «блокировки» периода, выбранного первым клиентом, и предотвратить второго клиента, который хочет зарезервировать тот же период?

Обновление для одного документа в MongoDB является атомарным, поэтому вы можете установить что-то флаг заказа, как:

db.time_reservation.update(
    {_id: "<period primary key>", reserved: false,}, { 
     $set: { 
      reserved: true, 
      reservedAt: new Date() 
     } 
    }); 

И как я могу исправить таймер на 10 минут, а если нет оплатить за период «доступность», разблокировать этот период в календаре?

Вы можете использовать команду хрон, который будет выполнять что-то вроде

db.time_reservation.update({ 
    reservedAt: { 
     $lt: new Date(ISODate().getTime() - 1000 * 60 * 10) 
    } 
}, {$set: {reserved: false}}); 

Как создать хронометр синхронизируется с сервером и перенаправлять на домашней страницы, когда время ожидания истекло?

Многие возможные решения:

  • Вы можете проверить это на каждом этапе бронирования

  • Вы можете получить временную метку из серверной и проверить его (сохранить его в куки, если это does'nt SPA)

+0

Спасибо за ваш ответ. Если я использую доктрину. Это то, что операции всегда атомарны? – Oneill

+0

Да и доктрина ничего не могут с этим поделать - это особенность монгодба. Вам просто нужно проверить результат этого обновления - он должен вернуть количество измененных строк. Если он равен нулю - это означает, что время зарезервировано. – vuliad

+0

Благодарим за помощь! – Oneill

 Смежные вопросы

  • Нет связанных вопросов^_^