2011-04-20 24 views
2

我在一個場景中,我有兩個不同的數據庫,我想在這兩個數據庫中提交不同的更改,如果其中一個提交失敗,另一個也會失敗。如何將兩個交易綁定在一起?

如果我在'數據庫A'上的'事務A'和'數據庫B'上的'事務B',我怎樣才能將兩個事務綁定在一起,這樣兩者都會原子地成功或失敗。

我想不出有辦法做到這一點。如果'交易A'失敗很容易回滾'交易B',但如果'交易B'失敗時'交易A'已經提交,我搞砸了。

我想知道是否有一種技術在特定的數據庫產品中處理此問題,或者如果存在通用模式來處理這種情況,甚至可以應用於任何事務性系統(如綁定數據庫)與事務消息隊列交易。

回答

2

您需要使用分佈式事務管理器(在最簡單的情況下,您可以將程序本身作爲)。

X/OpenXA是用於管理分佈式事務的最廣泛使用的標準,大四的所有數據庫都在本地支持它。

0
using (TransactionScope scopeExternal = new TransactionScope()) 
{ 
    using (TransactionScope scope1 
      = new TransactionScope(TransactionScopeOption.Suppress)) 
    { 
     ... operations for 1st DB 
     scope1.Complete(); 
    } 


    using (TransactionScope scope2 
      = new TransactionScope(TransactionScopeOption.Suppress)) 
    { 
     ... operations for 2nd DB 
     scope2.Complete(); 
    } 

    scopeExternal.Complete(); 
} 

如果無論從scope1scope2任何交易失敗,它拋出,從scopeExternal交易防止提交一個例外。

相關問題