2017-05-01 24 views
1

我有一個Azure api應用程序(AzureApi1),它具有一個可執行多個http請求的操作。該操作將數據插入到Azure Sql Db的多個表中。在Azure分佈式事務中當一個http調用失敗時,回滾完全操作的最佳方法

然後在相同的代碼中進行外部API調用(ExApi)。使用來自外部調用的結果,它插入/更新一些其他表。這不在Azure中。

然後它調用到另一個API(AzureApi2),它是在相同的資源組作爲第一個中和插入數據到另一個天青SQL數據庫,其也是相同的資源組中使用。

我已經在AzureApi1和AzureApi2中使用了TransactionScope,它們可以單獨爲它們工作。然而,由於有一個外部api介於兩者之間,並且這不在我的控制之內,所以如果發生該api調用的任何故障,我需要回滾完整的操作。目前,第一個API正常回滾,但是,由於第二個API調用是一個不同的http調用,它並不屬於第一個API的事務範圍。 我需要一種方法來回滾第二個Sql Db中的數據以及發生任何失敗。

在這種情況下手動回滾的最佳選擇是什麼?

回答

1

對於多Azure的SQL DB之間的分佈式事務,你可以使用elastic database transactions。但是,彈性數據庫事務不能跨越本地SQL Server和Azure SQL數據庫。您需要爲這種情況創建您自己的分佈式事務協調器。

我建議你創建一個新的Web API作爲協調器來監視所有操作的狀態。步驟可能如下,

  1. 如果操作失敗,它應該向協調器發送消息(成功或失敗)。

  2. 如果所有的操作都完成後,協調器將發送消息(commit或rollback)到各經營者。該消息取決於從每個操作收到的所有消息。

  3. 每個操作都會提交更改併發送提交結果(成功或失敗)來協調。

  4. 到每個操作依賴於從每個操作接收的提交的結果的協調器將發送最終狀態。

  5. 我們可以爲這些通信添加超時。如果發生超時,我們需要回滾所有的操作。

+0

嗨@amor感謝您的回覆。該解決方案很好,但在時間和資源方面會花費太多。特別是在這種情況下,其中一個http請求輸入依賴於來自其他http響應的結果,我不確定此解決方案是否適用。 –

+0

該解決方案適用於任何一般分佈式事務。分佈式事務需要一個協調器來監視狀態。我們使用分佈式事務的原因是我們希望確保應用程序每個分支的一致性。 – Amor

相關問題