2009-12-02 16 views
1

我正在開發一個活動預訂應用程序,並且很難弄清楚如何管理預訂過程。我知道關於數據庫交易和關於鎖定的一些信息,但是我有很多業務規則需要在預訂之前進行驗證,我擔心性能瓶頸。正在同步c#/ asp.net預訂應用程序

這裏是發生了什麼事情的總結:

  • 事件包含
  • 用戶可以在事件預定一個點位的最大數量
  • 每個用戶都有錢帳戶和每個事件花費一定金額

鑑於上述參數,以下業務規則是我需要驗證的預定發生:

  • 用戶尚未訂出一個位置這一事件
  • 用戶有足夠的資金來預訂事件
  • 事件已經至少一處,
  • 事件不與其他衝突用戶已預訂的事件(沒有那麼多問題,因爲我可以在顯示頁面時檢查此問題並隱藏用戶的此事件)

我主要擔心的是,如果我從數據庫中提取所有信息前面(即事件,用戶,帳戶和現有預訂),當我運行所有驗證並提交新預訂時,系統狀態可能會發生變化(即其他人預訂了最後一個地點,錢已經離開我帳戶等)。

如果我要鎖定代碼/數據庫表,這個預訂過程中,我有可能(??)鎖定了一段時間,影響系統中的其他操作,並導致在高峯時間的性能問題。

任何人都可以提出一種方法,我可以管理或至少限制這些顧慮。

我建立在C#中asp.net應用程序,並使用SQL Server 2005

回答

2

我覺得一個很好的例子,來看看是如何特瑪保留對於可能會購買的機票的座位。他們告訴你,在座位重新投入庫存之前,你有很多時間。它推動購買者作出決定或者其他人將有機會參加座位。這真是你最大的障礙。至於檢查業務規則,你必須這樣做。在那裏需要做什麼沒有魔法。如果你需要數據來驗證規則,那麼這就是你需要做的。有了一些適當的映射和概述,你可以找到效率。我希望能回答你的問題。

祝你好運!

+1

確實;對於我創建的系統,我非常廣泛地觀察了Ticketmaster。這是迄今爲止最好的答案 - 與已被證明有效的方法一致。 – 2009-12-02 18:48:35

+0

關於拆分預訂流程的思考已經澄清了相當多的情況。通過隔離需要發生的步驟,我可以最大限度地減少打開任何鎖或事務的時間,並根據需要自由地收集數據。它還使我能夠在操作或驗證失敗時明確回滾場景,而不是處理一個大的操作。非常感謝答覆;它幫助很多 – swingdoctor 2009-12-03 10:53:43

1

一個解決方案:

  1. 搶先預訂點(以 「持有」 狀態)。
  2. 驗證。
  3. 如果由於業務規則而無法保留預訂,請將其刪除。如果不是,將狀態更改爲「預訂」
+0

+1,還有一點需要注意您執行操作的順序,並在出現故障時將其撤消。 – RickNZ 2009-12-03 07:54:09

1

如果回到80年代並閱讀關於交易處理主題的文獻,您會發現討論最多的例子之一是航空預訂系統。有充分的理由,因爲這是涉及事務處理的所有問題之一的OLTP主題:正確性,輸出量,爭用,死鎖。你所描述的是一個非常類似的問題,但不是航空座位,你有事件插槽。所以是的,你會遇到所有這些問題。

沒有魔法精靈塵。這是一個難題。但有一些指導方針:

  • 富有的弗雷德不能永遠鎖定一個插槽。健忘的弗雷德是打開預訂屏幕,選擇座位,然後去吃午飯而沒有完成交易的用戶。如果允許,則系統將緩慢「泄漏」未使用的插槽
  • 數據庫鎖定在等待用戶輸入時過於昂貴。
  • 吞吐量只能通過粒度鎖才能實現。
  • 業務邏輯不應該嘗試對相關項目進行concurent更新。
  • 向用戶顯示的所有內容均應視爲「暫定」。
  • 用戶界面應準備好處理更新衝突。
  • 更新邏輯應該始終遵循相同的層次(例如,如果約定的更新邏輯是賬戶 - >用戶 - >事件 - >預訂,則嘗試更新預訂 - >事件 - >用戶的流氓事務將導致死鎖)。

而作爲事實上有限制這些問題的方法:workflow processing通過transactional queues,充分利用correlated items exclusive lock out支持。不是你的日常ASP任務,所以我建議你堅持你所知道的。

+0

感謝您的詳細回覆。它概述了我在實施該系統時會牢記的一些擔憂。正如我在之前的評論中提到的那樣,將流程分解成若干合乎邏輯的步驟肯定會幫助我避免潛在的長事務和/或鎖定問題。 – swingdoctor 2009-12-03 11:02:28