使用 laravel 处理预订系统中的并发性



我正在Laravel 5.2中开发一个带有postgresql的REST api,用于处理具有start_time和end_time的不同机构的预订。用户可以在前端查看特定场所可用的不同时间并进行预订。这是有问题的情况:

  1. 客户 A 想要预订场所。看到机构 A 从 15:00 hs 到 20:00 hs 空闲
  2. 客户 A 选择 16:00 到 17:00 的时间。(必须按按钮确认预订(
  3. 客户 B 想要预订场所。看到机构 A 从 15:00 hs 到 20:00 空闲
  4. 客户B选择16:00至17:00(再次按下按钮确认预订(
  5. 客户 A 确认预订
  6. 如果客户 B 确认预订,我们将同时进行 2 次预订。

已经阅读了很多关于 laravel 中的队列的信息,我不确定这是否是解决此问题的正确方法。

这些场所没有任意时间,因此客户可以接受 1 或 2 或 3 小时的预订。

这是我的预订模式

    Schema::create('bookings', function (Blueprint $table) {
        $table->increments('id');
        $table->timestamps();
        $table->timestamp('start_time');
        $table->timestamp('end_time');
        $table->integer('user_id')->nullable();
        $table->integer('establishment_id')->nullable();
        $table->string('name')->nullable();
        $table->string('phone_number')->nullable();
    });

注释指出原子数据更改应由数据库管理。在大多数现代关系数据库中,有一些工具可以帮助解决这个问题,例如事务、外键、复合键和约束。Eloquent 和查询生成器都对上述所有内容都有一些支持。

使用事务,您可以在读取/写入数据时锁定一个或多个数据库表。如果发生故障,可以回滚所有更改。这意味着您可以执行多个从属操作/更改,并保证它们将一起失败/成功,并且在该事务期间不会发生外部数据更改。

由于您不限于单小时预订,因此简单的组合键将不起作用,但您可以使用事务来查询某个时段是否可用,然后在同一事务中预订该时段。这将通过 laravel/qb 与多个 rdb 实现兼容。

另一种可能性能更高的方法是使用具有唯一约束的复合键,并在幕后预订多个 1 小时时段 - 这会将预订时间限制为您使用的任何预订单位的倍数,例如 1 小时单位不允许 1 1/2 小时预订,您需要 30 分钟单位

拉拉维尔交易

Laravel创建复合索引

最新更新