如何将两个交易绑定在一起?

问题描述:

我在一个场景中,我有两个不同的数据库,我想在这两个数据库中提交不同的更改,如果其中一个提交失败,另一个也会失败。如何将两个交易绑定在一起?

如果我在'数据库A'上的'事务A'和'数据库B'上的'事务B',我怎样才能将两个事务绑定在一起,这样两者都会原子地成功或失败。

我想不出有办法做到这一点。如果'交易A'失败很容易回滚'交易B',但如果'交易B'失败时'交易A'已经提交,我搞砸了。

我想知道是否有一种技术在特定的数据库产品中处理此问题,或者如果存在通用模式来处理这种情况,甚至可以应用于任何事务性系统(如绑定数据库)与事务消息队列交易。

有一个称为“两阶段提交”的标准数据库过程,大多数商业RDBMS都以某种方式成功实现了2PC。

以下是一些参考文献;

SQL服务器:http://msdn.microsoft.com/en-us/library/aa754091(v=bts.10).aspx 甲骨文:http://download.oracle.com/docs/cd/E14072_01/server.112/e10595/ds_txns003.htm MySQL的:http://dev.mysql.com/doc/refman/5.0/en/xa.html

您需要使用分布式事务管理器(在最简单的情况下,您可以将程序本身作为)。

X/OpenXA是用于管理分布式事务的最广泛使用的标准,大四的所有数据库都在本地支持它。

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交易防止提交一个例外。