2011-07-02 33 views
1

我的web應用程序(銷售點)處理多個分支機構的銷售。每個銷售都有一個唯一的整數ID。分支1上的某些銷售ID爲n,則分支2上的下一個銷售爲n +1。當webapp離線時處理銷售交易

當分支機構失去互聯網連接時,我將銷售信息保存在瀏覽器內部數據庫中,其中銷售ID是最後一個銷售ID加1。當連接恢復時,我將該信息發送給服務器,然後將其存儲在真實數據庫中。

當兩個或更多分支機構鬆動互聯網連接時會發生噩夢。因爲當他們在離線銷售和互聯網回來時,服務器將獲得兩個具有相同ID的銷售,這是非常可怕的,因爲客戶票據已經打印完畢!

我現在的計劃是將每個銷售ID從分行ID和該分行的實際銷售編號混合在一起。所以分支1銷售ID將是1-1,並且分支2的下一個銷售將是2-1。聽起來不錯,直到布拉克有兩個銷售點,情況並非如此,但它不是很有前途的證據。

您認爲最好的方法是什麼?有沒有更好的方法來做到這一點?

回答

1

唯一真正安全的避免ID衝突的方法是讓服務器始終分配ID。如果POS機脫機,那麼您可能需要分配本地和臨時ID以在本地記錄銷售,然後當POS重新聯機時,您可以從服務器獲取真實ID並在發送事務之前將本地ID修改爲真實ID 。我曾經有一個系統使用負數來表示客戶端創建的ID和服務器創建ID的正數。當服務器收到負面的ID時,它會將其更改爲唯一創建的服務器ID並將該ID返回給客戶端,以便客戶端可以使用真實的事務ID更新其數據庫。

如果您希望/需要全局唯一的客戶端定義的ID,則每個POS客戶端都需要一個服務器分配的uniqueID,該ID可以是多部分化合物ID的一部分。然後,每個客戶端可以維護自己的計數器,當它與唯一的客戶端ID結合使用時,它始終是全球唯一的ID。它是您的branchID概念的擴展,除了它是唯一分配給每個客戶端的clientID,因此您可以在每個分支上擁有多個POS客戶端。分配clientID既可以在客戶端安裝時手動完成,也可以通過在某些設置或初始化過程中向服務器請求唯一的clientID來更動態地完成。

這樣的技術對你來說最實用取決於你的系統比你在這裏描述的要多得多,所以你要麼根據你的知識來選擇,要麼描述你的系統如何工作我們能夠幫助更多。

0

你所描述的複合鍵是解決這個問題的一個很好的解決方案。當我需要避免分佈式情況下的關鍵衝突時,我傾向於使用GUID。

+0

在這種情況下,如果您使用GUID(這很不明智並且通常人們不願意使用它們),您只需要在客戶端使用GUID。一旦客戶端與服務器同步後,服務器就可以分配適當的標識符供將來使用。 –

+0

@我會讓計算機處理GUID,它們比我快得多。如果有疑問,我會選擇一個GUID作爲PK的任何一天。當需要將來自數千個不同來源的10個數據混合在一起時,您會非常高興您沒有使用從1開始的整數。 – ScottS

1

理想情況下,每個銷售點都有自己的ID。例如,我曾經爲一家國際零售連鎖店工作(不會在此列出),在全球各地擁有數千家分支機構,每家分店最多有15個銷售點。每個POS都有自己的ID分配給它 - 並且在對後端系統進行認證時使用了這個ID。

如果您的設置是這種情況,那麼您應該使用POS ID代替分支ID。這樣,如果您在同一分支中有多個POS,則將POS ID預先掛起到交易ID。