2009-10-29 110 views
1

我有兩個數據源:一個是傳統數據源(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; 
} 

是否可以接受?有更好的解決方案嗎?

回答

1

您正在有效地滾動您自己的兩階段提交事務。一個完全健壯的解決方案需要兩個資源的合作,並且通常最好使用支持2PC的事務管理器完成。

這裏的根本問題是,你沒有保護你自己的應用程序的失敗(他扮演的是事務管理器的角色),因此不能保證你可以回滾這個遺留問題。 考慮一下你的應用程序在它即將調用legcacy.Rollbock()的時候的失敗。你現在沒有記錄你在「交易」中,所以當你的應用程序回來時,你沒有理由去執行該回滾。

可能的方法:

1)。使用真正的2PC,這是唯一可能的,如果您的WebSerice具有交易功能(技術上可行但實際上不太可能)。 2)。容忍一些不一致的風險。許多系統實際上是這樣做的,

3)。嘗試你正在進行的恢復,但接受它可能會失敗。添加某種形式的審計線索,可以檢測到不確定的結果,從而允許稍後進行手動修補。所以你可以添加一些審計日誌記錄,這將允許你檢測mismtached活動。這可以被看作是一種非常手動的2PC方法。

+0

我控制網絡服務及其來源,但程度,以便傳統的兼容性不被打破。不過我不認爲我可以投入到它的全部2PC兼容性(因爲時間表)。我想我們可以和#2一起生活(如果需要,可以手動修復)。我對2PC概念也很感興趣;你能推薦一個很好的閱讀嗎?谷歌顯示了很多鏈接,主要是關於Java,而我更喜歡一般的或與C#相關的閱讀。 – queen3 2009-10-29 18:31:33

+0

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

+0

那麼,感謝您的信息,它是有用的。但是我仍然認爲我們會去#3,這不是一個關鍵任務系統,我們可以在一個月內(甚至一週)手動修復一次。實施交易經理等,絕對是預算不足的。 – queen3 2009-10-30 10:16:54

相關問題