繁体   English   中英

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

[英]Handling concurrency in a booking sistem with laravel

我正在使用Largre 5.2开发带有PostgreSQL的REST api,该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();

    });

评论指出原子数据更改应由数据库管理的事实。 在大多数现代关系数据库中,有一些工具可以帮助解决此问题,例如事务,外键,组合键和约束。 雄辩的和查询生成器都对以上所有内容都提供了一些支持。

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

因为您不限于单小时预订,所以简单的组合键将不起作用,但是您可以使用事务查询空位是否可用,然后在同一笔交易中预订空位。 这将通过laravel / qb与多个rdb实现兼容。

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

laravel交易

laravel创建复合索引

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM