我有兩個數據源:一個是傳統數據源(Web服務)和一個數據庫。現在,當我處理請求時,我對兩者進行了更改。如果出現錯誤,我想回滾兩者。將兩個獨立數據源的事務處理爲一個
try
{
legacy.Begin(); db.Begin();
legacy.MakeChanges(); db.MakeChanges();
}
except (Exception)
{
legacy.Rollback(); db.Rollback();
}
問題是,如果遺留在回滾期間拋出(即網絡錯誤),該怎麼辦? db.Rollback()將不會被執行。反之亦然。 我看到的解決方案是:
legacy.Begin();
try
{
db.Begin();
try
{
legacy.MakeChanges(); db.MakeChanges();
}
except (Exception)
{
db.Rollback();
throw;
}
}
except (Exception)
{
legacy.Rollback();
throw;
}
是否可以接受?有更好的解決方案嗎?
我控制網絡服務及其來源,但程度,以便傳統的兼容性不被打破。不過我不認爲我可以投入到它的全部2PC兼容性(因爲時間表)。我想我們可以和#2一起生活(如果需要,可以手動修復)。我對2PC概念也很感興趣;你能推薦一個很好的閱讀嗎?谷歌顯示了很多鏈接,主要是關於Java,而我更喜歡一般的或與C#相關的閱讀。 – queen3 2009-10-29 18:31:33
MS世界的起點是http://msdn.microsoft.com/en-us/library/aa213077%28SQL.80%29.aspx參與真正的2PC的Web服務能力是WS Atomic Transaction http ://msdn.microsoft.com/en-us/library/ms733943.aspx – djna 2009-10-30 07:41:53
那麼,感謝您的信息,它是有用的。但是我仍然認爲我們會去#3,這不是一個關鍵任務系統,我們可以在一個月內(甚至一週)手動修復一次。實施交易經理等,絕對是預算不足的。 – queen3 2009-10-30 10:16:54