2011-08-12 66 views
6

過去,我使用TransactionScope和桌面客戶端應用程序來回滾不完整的多步事務。這種方法似乎不太可能在Web應用程序中起作用。跨多個HTTP請求的多步數據庫事務拆分

任何人都可以建議如何確保多個步驟,跨幾個頁面,如果整個過程未完成可以確保回滾? (他們的瀏覽器崩潰或者關閉瀏覽器在中間過程爲例)

當然,我會寫信給某種形式的臨時表,然後在一個事務中的最後記錄轉移到真正的表,但是執行競爭條件的風險。我想開始一個事務,提供多個頁面,每個頁面將一部分事務寫入表格,然後用一個提交完成事務,並且如果事務沒有完成,那麼當事務被回滾時會話結束。

或者我不是在想正確的方法?建議?由於我使用的是MVC 3,EF 4.1和Ninject,我不確定這將如何影響解決方案,但我想我會包含這些信息。

回答

8

跨幾頁不存在數據庫事務/ TransactionScope。即使試圖做這樣的事情也是非常錯誤的。

有兩個選項來解決這個問題:

  • 使用Session

    存儲在會話數據,並堅持只有當用戶完成所有的步驟的數據庫,並確認保存。這絕對是你需要的。]

  • 使用工作流基礎和長時間運行事務。

    長期運行的事務不是數據庫事務 - 他們是,你必須手動實現(長期運行的事務回滾)補償完全定製的解決方案。您仍然必須檢測到您的工作流程應該得到補償,但這不是您的解決方案所必需的。對於需要多個會話進行「交易」的解決方案。

+0

這意味着你必須手動處理併發。這對我來說似乎是一種代碼味道。 –

+0

在Web應用程序中手動處理併發性非常普遍。數據庫事務應儘可能短 - 在大多數常見情況下,小數秒。你想做什麼意思數分鐘數據庫密集型鎖定=您的應用程序將執行糟透了。 –

1

你可能會看看建立nservicebus或masstransit並使用他們的傳奇故事。

+0

服務總線似乎是多餘的,因爲我也使用服務位置的IoC。 –

+3

@Mystere這沒有任何意義。服務巴士與國際奧委會有很大不同。薩加斯將消除你的競爭條件,並允許非常明確的狀態轉換(消息)。但是,您可能只需使用臨時表即可離開。 – Ryan