【问题标题】:Concurrency model mongodb doctrine symfony并发模型 mongodb 学说 symfony
【发布时间】:2017-01-22 12:57:45
【问题描述】:

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

因此不可能有 2 个客户同时预订同一时间段。

当客户选择一个时期并点击«预订按钮“时,预订对象被保存在会话中。客户购买此预订并在预订对象保存在预订集合后。

如何“锁定”第一个客户选择的期间,防止第二个客户想要保留相同的期间?

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

我使用 symfony 3 和 mongodb 与学说。

谢谢。

【问题讨论】:

    标签: php mongodb concurrency doctrine-orm symfony


    【解决方案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,则将其保存到 cookie)

    【讨论】:

    • 感谢您的回答。如果我使用教义。操作总是原子的吗?
    • 是的,Doctrine 对此无能为力——这是 mongodb 的特性。您只需要检查此更新的结果 - 它必须返回修改的行数。如果它等于 0 - 这意味着时间被保留。
    猜你喜欢
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2012-01-10
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    相关资源
    最近更新 更多