2015-03-30 61 views
0

我已通過MongoU課程和中途通過第二。我已經閱讀了我所能做的,並做了我所能學習的東西,但未能學會如何處理我認爲的標準情況。MongoDB和寫/讀一致性

考慮酒店客房的預訂系統。這裏是一家集的預訂:

4/1 - 1 4/1間 - 2 4/1房間 - 房間3

然後當客戶端檢查預定集合{日期:4/1客房: 3},他們會發現一個預訂,並且該應用程序可以拒絕預訂。

但是,如果兩個用戶同時查找{date:4/1 Room:4},則應用程序將繼續爲兩個客戶預訂,這意味着他們將嘗試創建預訂。

接下來會發生什麼?其中一個客戶獲得預訂,另一個客戶失敗。有點競爭條件?或者一個客戶是否有預訂,其他人是否會覆蓋它。

這可以防止與寫入問題?或者其他一些鎖?或者這對於更多的原子數據庫來說更好?

我所看到的所有演示都與博客有關,而博客對於獨特數據的關注很少。

回答

0

一般來說,您需要小心數據模型,當然還有您的應用程序流。

一個防止重複訂票的方法是使用複合_id場:

{ 
    _id: { room: 1, date:"4/1" } 
} 

所以,一旦房間1預訂了4/1,沒有辦法對房間1重複預約可以創建,因爲_id's保證是唯一的。第二個insert將失敗。或者,您可以在任意複合字段上創建唯一索引。

請注意,如果沒有適當的權限檢查,您的應用程序不應該插入或更新此文檔,但不適用於MongoDB。在最簡單的情況下,對於更新,您需要檢查嘗試更新文檔的用戶是否是預訂房間的用戶。所以我們的模型需要擴展:

{ 
    _id:{room:"1",date:"4/1"}, 
    reservationFor:"userID" 
} 

所以現在變得非常簡單:插入預留之前,您檢查一個。如果結果不爲空,則已經爲該房間預留了房間。如果插入時由於重複的ID而引發異常,則同時進行預約。在進行更新之前,您需要檢查reservationFor是否保存當前用戶的用戶ID。

如何應對這種情況在很大程度上取決於用於開發應用程序的語言和框架。我傾向於採取相應的例外並相應地修改errorMessage

+0

嘿,謝謝你的回答。我想你是對的。 有趣的是,獨特的化合物_id的解決方案就在前幾天來到我身邊,認爲這將是一種保證它獨特的方法。 感謝您的深思熟慮的答案。保重。 – csduarte 2015-04-07 18:31:36