2

在我當前的項目中,我們正在研究分佈式雲應用程序,該應用程序將存儲實體的狀態和相關事件。當從隊列中收到消息時,我們將更新SQL Azure中實體的狀態,並將與該更新相關聯的事件保存在表存儲中。SQL Azure和Azure表存儲之間的事務

它看起來是這樣的:

  • 開始的UnitOfWork
    • 更新實體在SQL Azure中
    • 保存事件表存儲
    • 提交交易
  • 結束的UnitOfWork

我們在這裏遇到的問題是,我們無法在一個事務中提交SQL Azure和Table存儲中的更改。因此,當SQL Azure中的實體保存失敗時,我們希望回滾表存儲中事件的保存。

任何幫助,非常感謝。

+3

通過觀看[本視頻](http://channel9.msdn.com/Blogs/Subscribe/Negotiate-Promise-Do-Transactions)它真的很有趣,並討論你的情況。這不是一個直接的解決方案!但是對「雲思維」與「DTC思維」有很好的洞察力。 – astaykov

回答

2

如果我理解你的目標,你正在試圖掩蓋以下2種情況:

  • 如果DB插入失敗,回滾Azure Table中
  • 如果Azure Table中插入失敗,回滾SQL Azure的

假設你在同一個線程中執行兩個請求,你是否嘗試過這樣的方法(僞代碼)?請注意,我正在使用數據庫引擎的事務功能;這與MSDTC並不相同,因爲我只爲單個連接執行此操作 - 所以這是受支持的。

dbConnection.BeginTransaction; 

try { 
    // add record in database - it is in a transaction so it can be rolled back 
    insert_into_sqlazure; 
    } 
catch 
{ 
    // automatic rollack - just exist with error 
    exit_with_error; 
} 

try 
{ 
    insert_into_azure_table; 
    dbConnection.CommitTransaction; 
} 
catch 
{ 
    dbConnection.Rollback; 
    exit_with_error; 
} 
+0

嗨Herve,今天我會試試你的解決方案:-) thx allot –