2011-07-12 48 views
2

我正在研究爲應用程序編寫Web服務。在這個應用程序中,我們處理事務中的所有事情,因爲「工作單元」通常不是單個實體,而是跨越多個表的多個實體。有些情況下我們希望「全部或全部」,並且交易非常有意義。但我不確定如何在網絡服務中做到這一點,也不應該如此。Web服務應該是事務性的嗎?

我覺得Web服務應該是無狀態的,提供的API應該建立在每個實體的基礎上,但我不確定如何處理「部分工作」,如果一部分失敗,應該發生回滾。

Web服務應該是事務性的嗎?你將如何實現交易,是否會沿着發送「BEGIN TRANSACTION」並以「END TRANSACTION」結束?

如果網絡服務是無狀態的,你如何處理不是獨立的「工作單元」? 有沒有關於這個話題我可以閱讀的任何明確的文獻?

感謝,

+0

我認爲Web服務層不會是事務中的actor,而是請求事務由下面的層完成,並將結果報告給客戶端,無論是提交還是回滾。如果您被要求提供超越一個應用程序節點內可能發生的事務邏輯,我會稱之爲「設計異味」。 – wberry

回答

4

Web服務可能是幕後全或無的,但你有一個選擇,你暴露給客戶端的內容。

如果您希望客戶端了解提交/回滾行爲,您必須提供「補償事務」作爲API的一部分。因此,如果一個用例創建一個新的事務,則必須提供一個補充方法來刪除它並告訴用戶創建成功或失敗。與所有其他方法一樣。

我認爲這暴露了太多的服務正在做什麼。客戶被迫知道太多。這是一個糟糕的封裝。

我認爲這是一個更好的設計,讓知識隱藏在服務內部。向用戶報告成功或失敗,但就是這樣。

這意味着您必須將您的服務設計得足夠粗糙,以涵蓋完整的工作單元。讓它編排數據源和其他服務來完成用例。