2016-01-23 68 views
1

PostgreSQL 9.3如何防止覆蓋共享約會簿中的記錄?

我正在寫一個標準的預約書。該書每隔15分鐘會有三列,並且會有多個客戶端同時從不同的位置寫入。

如果兩個用戶的A和B同時預約,我該如何阻止用戶B覆蓋用戶A的約會? (也就是說,一旦用戶A預約了 ,用戶B的信息就會過時 - 直到他試圖保存預約記錄時,他纔會知道用戶A做了什麼)。如果用戶B想要使用的約會時間已經被分配,我希望用戶B被通知它不可用並且不覆蓋用戶A.

我確定這是一個基本和常見的問題,但我無法把頭圍住它。

感謝您的任何幫助,建議或參考。

+1

https://en.wikipedia.org/wiki/Optimistic_concurrency_control –

+0

此外,你最好只存儲實際約會,而不是每隔15分鐘間隔 –

+1

@NeilMcGuigan +1來定義真正的問題。 :) –

回答

1

如果存儲的約會,例如

ID,CUSTOMER_ID,時間
1,32,2016年3月10日十時15分00秒
...

只需添加一個獨特的時間列上的索引。然後,如果您嘗試在同一時間插入一行,則會出現錯誤。如果您想同時允許多個預訂,則可以添加time_slot列並將其包含在索引中。

ID,CUSTOMER_ID,時間,TIME_SLOT
1,32,2016年3月10日10點15分00秒,1
2,15,2016年3月10日10點15分00秒,2

create unique index appointments_time_timeslot_idx on appointments (time, time_slot); 
+0

@BjornNisson經過深思熟慮後,我得出了同樣的結論。在我的情況下,額外的問題是實際的保存是通過默認爲樂觀併發的實體框架執行的。兩者之間的管理有點棘手。 :) –

+0

你確定你甚至需要鎖定?如果你想預約預約時間,你可以通過「確認」欄來解決。然後,您可以在用戶選擇時間後立即插入一行,並在用戶確認時將確認標誌更新爲true。 –

+0

然後您可以例如清理工作,刪除舊的未確認預訂。 –