【问题标题】:How to bind two transactions together?如何将两个事务绑定在一起?
【发布时间】:2011-08-09 15:24:12
【问题描述】:

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

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

我想不出办法来做到这一点。如果“事务 A”失败,回滚“事务 B”很容易,但如果“事务 A”已经提交,但如果“事务 B”失败,我就完蛋了。

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

【问题讨论】:

    标签: database transactions


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      有一个称为“两阶段提交”的标准数据库流程,大多数商业 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

      【讨论】:

        【解决方案3】:
        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 事务提交。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-09
          • 2016-04-01
          • 1970-01-01
          相关资源
          最近更新 更多