如何将两个事务绑定在一起?

时间:2011-04-20 15:52:31

标签: database transactions

我处在一个场景中,我有两个不同的数据库,我想在这两个数据库中提交不同的更改,如果其中一个提交失败,另一个也会失败。

如果我在“数据库A”上有“事务A”,“数据库B”上有“事务B”,我如何将这两个事务绑定在一起,以便原则上成功或失败。

我无法想办法做到这一点。如果“交易A”失败,很容易回滚“交易B”,但如果“交易A”已经提交时“交易B”失败,我就搞砸了。

我想知道是否有一种技术可以在特定的数据库产品中处理这种情况,如果有一种通用模式来处理这种情况甚至可以应用于任何事务系统,例如绑定数据库事务,那就更好了使用事务性消息队列。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

以下是一些参考资料;

SQL Server: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

答案 2 :(得分: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事务提交的异常。