2017-01-22 26 views
1

我正在使用平台 - MarketPlace进行预订。 有专业人士创建可用性。可用性的创建周期为例如上午8:00至下午5:00。这是保存在mongodb中的时期。 客户选择1小时。 (客户日历动态生成时间为1Hour)例如: 上午8:00至下午5:00期间有:上午8:00-9:00,上午9:00至上午10:00等...并发模型mongodb学说symfony

所以2个客户不可能同时保留同一时段。

当客户选择一个时间段并点击“书籍按钮”时,保留对象被保存在会话中。客户购买此预订后,预订对象保存在Reservation集合中。

如何为第一位顾客选择“锁定”期间并防止第二位顾客保留同一期间?

我该如何修复10分钟的定时器,如果没有期限“可用性”的付款,解锁日历中的那段时间?在超时过期时如何创建与服务器同步并在主页上重定向的计时器? 我必须创建一个临时收集并保留进行中吗?或者将我的收藏中的对象预约保存为状态为“进行中”的预订?

我使用symfony 3和mongodb的教义。

谢谢。

回答

1

如何为第一位客户选择的“锁定”时间段和 防止第二位客户想要保留同一时间?

MongoDB中的单个文档的更新是原子,这就是为什么你可以设置保留标志是这样的:

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

我怎样才能解决这个定时器10分钟,如果没有支付 期间“可用性”,在日历中解锁那段时间?

您可以使用cron命令将执行类似

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

如何创建一个天文台与服务器同步,当超时到期重定向到 主页?

许多可能的解决方案:

  • 你可以在每一个预约阶段检查此

  • 您可以从后台得到时间戳和进行验证(将它保存到饼干,如果这是一点儿也不SPA)

+0

谢谢你的回答。如果我使用教义。这些操作是否始终是原子的? – Oneill

+0

Yes和Doctrine无能为力 - 这是mongodb功能。您只需检查此更新的结果 - 它必须返回修改的行数。如果它等于零 - 这意味着时间被保留。 – vuliad

+0

谢谢你的帮助! – Oneill