簡體   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