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

Php 使用laravel处理预订系统中的并发,php,postgresql,laravel-5,concurrency,Php,Postgresql,Laravel 5,Concurrency,我正在使用postgresql在Laravel 5.2中开发一个REST api,用于处理具有开始时间和结束时间的不同机构的预订。用户可以在前端查看特定场所的不同可用时间,并进行预订。以下是有问题的情况: 客户A想预订一家公司。查看机构A在15:00 hs到20:00 hs之间的空闲时间 客户A选择16:00到17:00的时间。(必须按下按钮确认预订) 客户B想预订一家公司。查看机构A在15:00 hs到20:00之间的空闲时间 客户B选择16:00至17:00的预约(同样,必须按下按钮确认预约

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

  • 客户A想预订一家公司。查看机构A在15:00 hs到20:00 hs之间的空闲时间
  • 客户A选择16:00到17:00的时间。(必须按下按钮确认预订)
  • 客户B想预订一家公司。查看机构A在15:00 hs到20:00之间的空闲时间
  • 客户B选择16:00至17:00的预约(同样,必须按下按钮确认预约)
  • 客户A确认了预订
  • 如果客户B确认预订,我们将同时进行2次预订
  • 我已经读了很多关于拉威尔排队的书,我不确定这是否是解决这个问题的正确方法

    这些机构没有任意的时间,因此顾客可以选择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 1/2小时的预订,您将需要30分钟的单位


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

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

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

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


    您遇到的问题永远不会用编程语言、框架、队列或任何东西解决。通过使用数据库解决了这个问题。这正是为什么您可以使用独特的约束和关系。您的数据库是数据驻留的中心系统,如果您不将其视为美化的文本文件,而是作为一个为原子性、并发性、隔离性和持久性而构建的系统,那么您就不会有任何问题。说到这里,试着在数据库级别而不是框架/语言级别上解决这个问题。你应该看看我读过的范围类型文档,它很有效!但是,Laravel既不支持tsrange数据类型也不支持exclude约束,因此我必须在迁移中添加原始查询。您遇到的问题从来没有,从来没有用编程语言、框架、队列或任何东西解决过。通过使用数据库解决了这个问题。这正是为什么您可以使用独特的约束和关系。您的数据库是数据驻留的中心系统,如果您不将其视为美化的文本文件,而是作为一个为原子性、并发性、隔离性和持久性而构建的系统,那么您就不会有任何问题。说到这里,试着在数据库级别而不是框架/语言级别上解决这个问题。你应该看看我读过的范围类型文档,它很有效!但是,Laravel既不支持tsrange数据类型也不支持exclude约束,因此我必须向迁移中添加原始查询。