2011-11-25 89 views
4

我被要求創建一個在線支付的在線預訂系統,我想知道在同一時間爲同一個房間預訂的兩位顧客要做什麼。在線酒店預訂系統,同時預訂?

例如:
與此同時:

customer1表和顧客2預訂了一個標準間僅具有可用1個室。 (房間可用性將顯示仍有1個房間可用)。然後他們同時點擊「確認」按鈕。

+0

爲什麼downvotes?我認爲這是一個有效的問題。 –

+0

在屏幕底部發出警告,表示預訂不是最終的,直到確認爲止,然後向任何用戶稍微緩慢地發出錯誤消息 - 他們並不真正在_exactly_同時點擊「確認」,所以一個或其他請求將首先進入並更新您的數據庫,而另一個請求應導致適當的錯誤消息。 – nnnnnn

+1

@nnnnnn:...直到意外發生和兩個請求* do *同時運行(在兩個單獨的線程中)。像這樣的事情需要鎖定或交易是可靠的。 –

回答

4

使用鎖定構造(可能在數據庫級別),以確保只有一個確認將一次通過。如果可能有這樣的競爭條件,你應該始終這樣做。這樣,您將始終知道誰是第一個,並且您可以告訴其他用戶他們太慢而無法確認。

您可能想要添加的另一件事是付款時間限制。在許多系統中,當您確認某件事情時,您將有一定的時間進行付款以獲得預訂。如果您在這段時間內沒有付款,確認將過期,房間將再次可用。

+0

謝謝先生......我會嘗試在我的系統上實現這些功能,我希望我可以用我當前的Web開發技能來完成這些功能。我在想也許我可以製作一張桌子,在那裏可以記錄未付費的預訂...... – KiiroSora09

+0

@ KiiroSora09:或者,您可以使用預訂表中的一個字段將預訂標記爲「掛起」。這樣你就不必創建兩張具有幾乎相同信息的表格。 –

0

有幾種方法可以解決這個問題。

  1. 如果我用戶選擇了一個房間,暫時將它從網絡前端中刪除。然後任何後來的訪客將無法選擇該房間預訂。如果第一個用戶沒有完成交易,則房間再次可用。
  2. 將鎖定在數據庫上的上方,只有一個記錄可以隨時
+0

馬丁爵士謝謝你的回答。我會查找如何鎖定數據庫 – KiiroSora09

+0

我不是一位先生,但是要感謝禮貌;-) –

+0

我喜歡對比我有更多知識的人表示尊重。特別是當他們試圖提供幫助時。 *我很佩服程序員:D – KiiroSora09

0

使用「臨時」系統,標誌着作爲預訂的臨時寫成提到的,說10分鐘。這些插槽隨後對後續請求不可用。如果預訂未在時限內完成,則該插槽將再次釋放。如果您在預訂時間段之前獲取所有客戶詳細信息,則退出率應保持較低水平。

您必須將時間框架和它的「臨時狀態」傳達給預訂者。如果你有後來的階段,訪客可以停下來,然後一個簡單的JS定時器倒計時的時間將有所幫助,並推動整個過程中的預訂。

或者,允許重複預訂,直到最後一個「付款」按鈕首先被按下時爲止。第二種方法會轉換得更好,第一種方法更「正確」。