我正在为我的应用程序使用.NET 2.0 / 3.5框架。我需要在多个连接上运行多个SQL命令,每个连接都在不同的服务器上(Oracle,SQL Server)。我需要确保这些命令是事务性的。
例如:我需要在Oracle和SQL Server数据库的表中执行INSERT,然后在没有抛出异常的情况下提交它们。如果有异常,我想在需要时在两台服务器上回滚。
我怀疑我需要使用System.Transactions和TransactionScope。这将要求我在数据库服务器和应用程序服务器上设置Microsoft分布式事务处理协调器(MSDTC)。
我看起来高低,找不到任何描述逐步设置MSDTC并进行相互身份验证的文章(包括配置防火墙设置和MSDTC设置。)我查看了有关设置MSDTC的Microsoft文档,但似乎完全没有毫无价值且没有完整记录(除非你能找到一篇关于如何设置它的非常好的MSDN文章。)
使用MSDTC是完成工作的唯一方法吗?
如果是这样,我该怎么配置呢?
编辑:
答案 0 :(得分:5)
可悲的是,两家供应商的官方文档似乎都很乐意提及互操作提供商或其他供应商,但他们似乎都不愿意承认对方数据库产品的存在。
您可能更喜欢Oracle Services for Microsoft Transaction Server上的文档。
从ODP.NET 10.2.0.3起,您应该(如果您已经适当配置了MS DTC并且OraMTS dll存在)能够简单地使用System.Transactions TransactionScope,就像在两个sql server之间协调一样数据库但使用sql server和oracle连接。可能需要Oracle 10以上版本才能完全开箱即用。
Here is a guide to using DTC from .net 2.0 and Sql Server 2005 onwards。特别是它注意到操作系统的要求(这应该在很大程度上不再是一个问题,但值得注意)。 此外,除非两个数据库和客户端都在同一台计算机上,否则必须启用网络DTC。
答案 1 :(得分:1)
我使用链接服务器完成我的所有任务。它使我们更容易管理连接信息和凭据。基本上一站式购物满足我们的所有需求。
编辑:更多细节 - 我们有一个严格用于报告的数据库。我们从整个公司的服务器获取数据。我们没有一个帐户可以访问这些服务器,其中一些我们使用功能ID,其他我们的AD凭据。将所有这些连接包装到单独的链接服务器中对我们来说效果最好。在我们的报告服务器上,我们目前有16个链接服务器。
我们还将查询结合到视图中,以便更轻松地访问我们的应用程序和水晶报表。因此,我们不必在代码中创建多个连接字符串,而只使用一个全局字符串连接到报告Db。
答案 2 :(得分:1)
我的回答可能有点奇怪,但我建议你(如果技术上可行)评估每个数据库使用2个独立事务。我对分布式事务/ XA的关注是整体数据库性能/可伸缩性/延迟。
2个试图证明我观点的链接:
答案 3 :(得分:0)
这是典型的分布式事务问题,也是MSDTC的用途。查找事务监视器和XA协议,以更深入地描述此类问题。
答案 4 :(得分:0)
使用多个连接时,您需要使用DTC。单个连接可以管理单个事务,但如果您有多个连接,则需要一个事务协调器来处理两阶段提交协议。
答案 5 :(得分:0)
我遇到了同样的问题。需要在2个SQL和1个Oracle数据库服务器之间进行分布式事务,所有这些都来自ASP.Net应用程序。
所以我在博客中写下了这段经历,所以下次我不会再浪费时间了。
请查看:
MS DTC Distributed transactions: Oracle 10gR2, SQL Server 2005 and Windows Server 2008 R2
答案 6 :(得分:-1)
是的,您需要创建一个事务范围,SQL和Oracle的ADO.Net提供程序会将每个连接注册到一个分布式事务中,由MSDTC协调。
关于如何设置MSDTC的MSDN文档非常详细,具体涵盖了您提出的问题:Enable Firewall Exceptions for MS DTC,Configuring Security for Distributed Transactions。
您省略提及您的客户端运行的操作系统,SQL Server版本,Oracle版本,SQL Server和Oracle的后端操作系统。您也忽略了告诉您遇到的任何实际问题或您看过的错误消息。现在,问题似乎位于键盘和椅子之间。