6

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

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

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

我看了高低,找不到任何描述逐步设置 MSDTC 和相互身份验证的文章(包括配置防火墙设置和 MSDTC 设置。)完全记录(除非你能找到我关于如何设置它的非常好的 MSDN 文章。)

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

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

编辑:

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

7 回答 7

5

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

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

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

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

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

于 2009-09-15T22:14:03.900 回答
1

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

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

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

于 2009-05-20T14:57:53.173 回答
1

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

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

  1. Martin Fowler 指出: “您必须注意提交的顺序,将更重要的提交放在最前面。在每次提交时,您必须检查它是否成功并决定如果失败该怎么办。”
  2. 关于 eBay 架构的采访
于 2009-09-16T17:04:06.733 回答
0

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

于 2009-05-20T15:11:16.673 回答
0

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

于 2009-08-31T20:58:49.513 回答
0

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

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

检查它:

MS DTC 分布式事务:Oracle 10gR2、SQL Server 2005 和 Windows Server 2008 R2

于 2011-12-16T22:58:57.880 回答
-1

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

关于如何设置 MSDTC 的 MSDN 文档非常详细,并专门涵盖了您提出的问题:为 MS DTC 启用防火墙例外为分布式事务配置安全性。

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

于 2009-09-18T10:39:48.373 回答