Php 使用laravel处理预订系统中的并发
我正在使用postgresql在Laravel 5.2中开发一个REST api,用于处理具有开始时间和结束时间的不同机构的预订。用户可以在前端查看特定场所的不同可用时间,并进行预订。以下是有问题的情况: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的预约(同样,必须按下按钮确认预约
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约束,因此我必须向迁移中添加原始查询。