[英]Handling concurrency in a booking sistem with laravel
我正在使用Largre 5.2開發帶有PostgreSQL的REST api,該api處理具有start_time和end_time的不同場所的預訂。 用戶可以在前端看到某些場所的可用時間並進行預訂。 這是有問題的情況:
已經閱讀了很多有關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分鍾
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.