【问题标题】:Multiple SQL Transactional Commands Across Different Database Connections跨不同数据库连接的多个 SQL 事务命令
【发布时间】:2009-05-20 13:10:47
【问题描述】:

我正在为我的应用程序使用 .NET 2.0/3.5 框架。我需要跨多个连接运行多个 SQL 命令,并且每个连接都在不同的服务器(Oracle、SQL Server)上。我需要确保这些命令是事务性的。

例如:我需要在 Oracle 和 SQL Server 数据库上的表中执行 INSERT,然后在没有引发异常的情况下提交它们。如果出现异常,如果需要,我想在两台服务器上回滚。

我怀疑我需要使用 System.Transactions 和 TransactionScope。这将要求我在数据库服务器和应用程序服务器上设置 Microsoft 分布式事务协调器 (MSDTC)。

我找了高低,找不到任何描述逐步设置 MSDTC 和相互身份验证的文章(包括配置防火墙设置和 MSDTC 设置。)我查看了有关设置 MSDTC 的 Microsoft 文档,但似乎完全毫无价值且没有完整的文档记录(除非你能找到我关于如何设置它的非常好的 MSDN 文章。)

使用 MSDTC 是完成工作的唯一方法吗?

如果是这样,我该如何正确配置它?

编辑:

  • 我在所有机器上都使用 Windows Server 2003。
  • 我有两个 SQL Server。一个是 SQL Server 2000,另一个是 2005。
  • 我有一台 Oracle 服务器,它是 11g 版本
  • 我们正在开发的应用程序有时必须以事务方式在所有三个数据库中更改/创建记录。
  • 键盘和椅子之间不是问题。我们阅读了 MSDN 上关于如何设置有关 MSDTC 的所有内容的文章,但我们无法让 DTCPing 和其他测试应用程序正常工作。我们正在寻找详细说明该过程的分步文章。我不止一次遇到过 MSDN 文档,其中“省略”了执行某些操作的步骤。

【问题讨论】:

    标签: .net sql tsql transactions msdtc


    【解决方案1】:

    遗憾的是,两家供应商的官方文档似乎都乐于提及互操作提供商或其他,但似乎都不愿承认对方的数据库产品的存在。

    您可能更喜欢需要Oracle Services for Microsoft Transaction Server 上的文档。

    • Oracle 文档:
      • 10g
      • 9i
      • 存在旧版本,但在 8 之后似乎发生了很大变化

    从 ODP.NET 10.2.0.3 开始,您应该(如果您已适当配置 MS DTC 并且存在 OraMTS dll)能够像在两个 sql server 之间进行协调一样简单地使用 System.Transactions TransactionScope数据库,但使用 sql server 和 oracle 连接。开箱即用可能需要 Oracle 10 及更高版本才能正常工作。

    Here is a guide to using DTC from .net 2.0 and Sql Server 2005 onwards。它特别指出了操作系统的要求(这在很大程度上应该不再是一个问题,但值得注意)。 此外,除非数据库和客户端在同一台机器上,否则必须启用网络 DTC。

    【讨论】:

      【解决方案2】:

      我的回答可能有点奇怪,但我会建议您(如果技术上可行)评估每个数据库使用 2 个独立事务。我对分布式事务/XA 的关注是整体数据库性能/可扩展性/延迟。

      2 个链接将试图证明我的观点:

      1. Martin Fowler notes: "你必须注意提交的顺序,把更重要的放在最前面。在每次提交时,你必须检查它是否成功,并决定如果失败该怎么办。"
      2. Interview regarding eBay architecture

      【讨论】:

        【解决方案3】:

        我使用链接服务器来完成我的所有任务。它使我们更容易管理连接信息和凭据。基本上可以一站式满足我们的所有需求。

        编辑:更多细节 - 我们有一个严格用于报告的数据库。我们从整个公司的服务器获取数据。我们没有一个帐户来访问这些服务器,其中一些我们使用功能 ID,其他我们的 AD 凭据。将所有这些连接打包到单独的链接服务器中对我们来说效果最好。在我们的报告服务器上,我们目前有 16 个链接服务器。

        我们还将查询封装到视图中,以便更轻松地访问我们的应用程序和水晶报表。因此,我们不必在代码中创建多个连接字符串,而是只使用一个全局字符串来连接到报告 Db。

        【讨论】:

          【解决方案4】:

          这是一个经典的分布式事务问题,也是 MSDTC 的用途。查找事务监视器和 XA 协议以更深入地描述此类问题。

          【讨论】:

            【解决方案5】:

            使用多个连接时,您需要使用 DTC。单个连接可以管理单个事务,但如果您有多个连接,则需要一个事务协调器来处理两阶段提交协议。

            【讨论】:

              【解决方案6】:

              我遇到了同样的问题。需要在 2 个 SQL 和 1 个 Oracle 数据库服务器之间进行分布式事务,所有这些都来自 ASP.Net 应用程序。

              所以我把那次经历写在我的博客里,所以下次我不会再浪费时间了。

              查看:

              MS DTC Distributed transactions: Oracle 10gR2, SQL Server 2005 and Windows Server 2008 R2

              【讨论】:

                【解决方案7】:

                是的,您需要创建一个事务范围,并且 SQL 和 Oracle 的 ADO.Net 提供程序会将每个连接注册到一个由 MSDTC 协调的分布式事务中。

                关于如何设置 MSDTC 的 MSDN 文档非常详细,并且专门涵盖了您提出的问题:Enable Firewall Exceptions for MS DTCConfiguring Security for Distributed Transactions

                您没有提及您的客户端运行的操作系统、SQL Server 版本、Oracle 版本、SQL Server 和 Oracle 的后端操作系统。您也忽略了告诉您遇到的任何实际问题或您看到的错误消息。现在,问题似乎出在键盘和椅子之间。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-02-28
                  • 2015-09-13
                  • 1970-01-01
                  • 2011-04-30
                  • 2022-07-26
                  • 2014-04-26
                  相关资源
                  最近更新 更多