在企业环境中,客户有时需要设置MSDTC事务来与远程Oracle目标服务器协同工作。由于跨产品的设置十分复杂,有时我们在更新一个已链接的Oracle数据库中的数据时可能会面临事务失败,例如:

服务器:消息 7391,级别16,状态1,行1

该操作无法执行,因为OLE DB Provider 'MSDAORA' 无法启动分布式事务。

OLE DB错误跟踪 [OLE / DB Provider 'MSDAORA' ITransactionJoin::JoinTransaction返回0x8000d048]

下面是帮助我们缩小和解决类似的问题的一般的步骤(开始操作之前,先尝试使用SQL的普通的select语句查询Oracle,确保服务器名称解析和它们之间的网络正常):

1。在Windows Server 2003中,选择"添加/删除程序程序"控制台,Windows组件中的"启用网络DTC访问"必须启用。可以在Windows组件\应用程序服务器\启用网络DTC访问下启用它。请参考:

817064如何在Windows Server 2003启用网络DTC访问

http://support.microsoft.com/default.aspx?scid=kb;EN-US;817064

2。打开DCOMCNFG,确保MSDTC选项卡下的安全配置的设置是正确的:

 

3。打开注册表,在Security键中,确保注册表值和UI设置相匹配:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\Security

 

4。 注册表中Oracle模块的配置是正确的:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\MTxOCI

 

OracleXaLib=oraclient9.dll

OracleSqlLib=orasql9.dll

OracleOciLib=oci.dll

 

尽管在这里我们使用Oracle 9i客户端作为举例,我们应该知道,在Microsoft数据访问组件(MDAC)2.5版本之后,微软的ODBC驱动和OLE DB Provider都只支持Oracle7和Oracle 8i:http://support.microsoft.com/Default.aspx?id=244661

一个新的支持Oracle 9i客户端的Microsoft.NET Managed Oracle Provider现已推出。请访问以下Microsoft网站来下载这个Provider:http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=4F55D429-17DC-45EA-BFB3-076D1C052524

对于其他版本的Oracle客户端(7 / 8)注册表键值设置,请参考:

193893 有关Oracle与Microsoft Transaction Server和COM +组件协同使用的信息

http://support.microsoft.com/default.aspx?scid=kb;EN-US;193893

 

5。从SQL服务器管理控制台中找到已连接的Oracle服务器名称。如果你不清楚如何找到Oracle服务器名称,请与当地的Oracle管理团队联系。

6。创建一个指向您的Oracle数据库的ODBC数据源名称(DSN)。请确保您的DSN使用的是Microsoft Oracle ODBC驱动程序。

a. 从管理工具中打开数据源对话框:

 

b. 单击用户 DSN选项卡上的添加按钮,选择Microsoft ODBC for Oracle,然后完成向导:

 

 

运行此命令,我们应该得到正确的结果,这说明纯Oracle事务工作正常:

Msdtcora.exe -U<oracle用户名> -P<oracle密码> -S<我们在第五步中找到的服务名 >

该Msdtcora.exe可以从如下地址得到:

http://download.microsoft.com/download/transaction/Utility/1/NT5/EN-US/DTCOra.exe

这个工具将跳过MSDTC并直接使用Oracle事务。如果Oracle测试程序可以连接到Oracle数据库服务器且不报错,很可能COM + / MTS也可以与Oracle正常工作。如果这一步失败,您应该联系Oracle支持团队以获取更多信息。

7。确保网络服务帐户(这是在Win2003中为MSDTC建立的新帐户)已被添加在c:\program files\oracle和c:\oracle(如果您设置了不同的Oracle根文件夹,需要做同样的工作),强制所有子对象继承父文件夹相同的设置。否则,MSDTC服务可能无法跟Oracle库进行交流。

如果Oracle事务仍然失败,即使在第6步中Msdtcora返回成功的信息,我们应该检查一下纯MSDTC服务是否工作正常。

你可以对其他已连接的SQL服务器发起MSDTC分布式事务处理(SQL服务器的链接也应该遵循的步骤1,2,3)来查看事务的进展。如果发生任何困难,联系 MSDTC的支持小组以获得进一步的故障排除思路。

 

更多信息

==============

280106如何在 SQL 服务器中设置到 Oracle 的链接服务器并进行故障排除

http://support.microsoft.com/default.aspx?scid=kb;EN-US;280106

微软Internet开发者支持小组