Microsoft KB Archive/191168

= INFO: Error "-2147168246 (8004d00a)" Failed to Enlist on Calling Object's Transaction =

Article ID: 191168

Article Last Modified on 3/14/2003

-

APPLIES TO


 * Microsoft Transaction Services 1.0
 * Microsoft Transaction Services 2.0

-



This article was previously published under Q191168



Note This error message may be associated with error number -2147168246 (8004d00a).

Important This article contains information about editing the registry. Before you edit the registry, make sure you understand how to restore it if a problem occurs. For information about how to do this, view the "Restoring the Registry" Help topic in Regedit.exe or the "Restoring a Registry Key" Help topic in Regedt32.exe.



SUMMARY
What does the message "Failed to Enlist on calling object's transaction" mean?

The ODBC Driver Manager reports this error when a transactional Microsoft Transaction Server component attempts to open a database connection and the Driver Manager cannot enlist the database connection in the current transaction. The ODBC Driver Manager enlists the database connection in the current transaction by calling the ODBC driver's SQLSetConnectionAttr (SQL_ATTR_ENLIST_IN_DTC) procedure. The ODBC Driver Manager displays the "Failed to Enlist" message if the call to the SQLSetConnectionAttr procedure fails.

For additional information, click the article number below to view the article in the Microsoft Knowledge Base:

193893 Using Oracle Databases with Microsoft Transaction Server



When Using Microsoft SQL Server
If this error occurs when your transactional Microsoft Transaction Server component is accessing a Microsoft SQL Server database, check the following:  Make sure that the Microsoft Distributed Transaction Coordinator(MS DTC) Service is started.

Make certain that the MS DTC Service is started on the system on which your Microsoft Transaction Server components are deployed. If your Microsoft Transaction Server application is accessing a Microsoft SQL Server database on a remote system, make sure that the MS DTC Service is started on that system also. This is frequently the cause of the "Failed to Enlist Error."

Perform the following steps to check the status of the MS DTC Service:  On the Start menu, select Settings, and then click Control Panel. Select the Services icon. Scroll through the Services list and confirm that the Status of the MS DTC service is Started. If the MS DTC Status is blank (not started), you can start it by selecting MSDTC and then clicking Start.  Check Your Network Configuration.

When a transactional Microsoft Transaction Server component on one system accesses a SQL Server database on another system, MS DTC propagates the DTC transaction from the first or primary system to the secondary system. Transaction propagation can only occur if the DTC process on the primary system can communicate with the DTC process on the secondary system. The DTC processes establish remote procedure call (RPC) connections in both directions, which means that a network configuration problem on either system can prevent the DTC processes from successfully communicating with one another. This causes ODBC to return a "Failed to Enlist" error.

Often the following MS DTC event is recorded in the Windows NT Application event log:

Primary: Session Bind Failed. Primary Timed Out while waiting for the secondary to Bind.

This error indicates that DTC on the Microsoft Transaction Server computer was able to bind to DTC on the SQL Server, but DTC on the SQL Server could not perform the reverse bind to the Microsoft Transaction Server computer.

If your network configuration is incorrect, every attempt to connect to the remote SQL Server database results in a "failed to enlist" error. If you consistently get a "failed to enlist" error even after Microsoft DTC has been started on both systems, the most likely cause of the failure is a network configuration error.

If this occurs, check your network configuration using Pingtest.bat as follows:   Use a text editor (such as Notepad) to create a file named Pingtest.bat. Copy the following batch file commands into it. echo off REM Usage pingtest OtherMachineName REM Must use a machine name and NOT an IP address ping -n 1 %computername% ping -n 1 %1 ipconfig /all echo on The batch file uses %computername% to display the local IP address. It then displays the IP address of the remote computer you specify in the command line when you run the batch file. When you invoke the batch file, you must specify the name of the remote computer and not its IP address. Using the computer name forces ping to resolve the machine name exactly the same as MS DTC does when it binds to the remote MS DTC computer. </li>  Run Pingtest.bat on the Microsoft Transaction Server computer to determine if you can ping the SQL Server computer by name. Capture the output from the batch file in a text file. For example, if Microsoft Transaction Server is running on computer A and SQL Server is running on computer B, use the following command: Pingtest B > AResults.txt </li>  Run Pingtest.bat on the SQL Server computer to determine if you can ping the Microsoft Transaction Server computer by name. Capture the output from the batch file in a text file. For example, if Microsoft Transaction Server is running on computer A and SQL Server is running on computer B, use the following command: Pingtest A > BResults.txt </li> Examine the contents of the two text files to ensure that the two computers can ping one another successfully.

If you use Hosts or Lmhosts files for TCP/IP name resolution, check these files very carefully to make sure that they contain valid computer name to IP address mappings. To do this, check the Hosts and the Lmhosts files in the Winnt40\System32\Drivers\Etc directory on both The Microsoft Transaction Server computer and the SQL Server computer. Frequently, the file on one system will be correct, while that on the other system is incorrect.</li></ol> </li> Configure the SQL Server to use TCP/IP rather than Named Pipes.

If you only see the "failed to enlist" error intermittently, then using Named Pipes rather than TCP/IP may be the cause of the problem. Using Named Pipes can result in intermittent "Failed to Enlist" errors.

Microsoft strongly recommends that you configure the SQL Server to use TCP/IP rather than Named Pipes. Using Named Pipes can result in Intermittent "Failed to Enlist" errors.  On the Start menu, select Programs, select Microsoft SQL Server 6.5, and then click SQL Client Configuration Utility.</li> Click the Net Library tab.</li> In the Default Network list, select TCP/IP Sockets.</li> Click Done.</li></ol> </li> Check Transaction Timeout.

The component's transaction may have stopped due to transaction time-out before the database enlistment completed. You can increase the transaction time-out value through the Microsoft Transaction Server Explorer. Use the following steps to increase the time-out value:

 Start the Microsoft Transaction Server Explorer and select Computers.</li> Right-click the computer where the transaction was initiated and click Properties.</li> Click the Options tab and specify a longer time-out value.</li></ol>

This is unlikely to be the problem unless your transactions take an unusually long time. However, it may be helpful to temporarily increase the time-out value to eliminate this as a potential source of trouble.</li></ol>

When Using Oracle
If this error occurs when your transactional Microsoft Transaction Server component is accessing an Oracle database, check the following: <ol> <li>Make sure that the MS DTC Service is started.

Make certain that the Microsoft DTC Service is "Started" on the system on which your Microsoft Transaction Server components are deployed.

Use the following steps to check its status: <ol style="list-style-type: lower-alpha;"> <li>On the Start menu, select Settings, and then click Control Panel.</li> <li>Select the Services icon.</li> <li>Scroll through the Services list and confirm that the Status of the MS DTC service is Started. If the MS DTC Status is blank (not started), you can start it by selecting MSDTC and then clicking Start.</li></ol> </li> <li>Install the latest Oracle Client software on the Microsoft Transaction Server computer.

Make sure that the latest Oracle 7.3 or Oracle 8 Client software patch release is installed on the system that contains the Microsoft Transaction Server components. Note that it is common to upgrade the Oracle software on the system that contains the Oracle database but fail to upgrade the Oracle software on the system that contains the Microsoft Transaction Server components. You must upgrade the Oracle software on the client system.

You can obtain the latest Oracle patches Windows NT from the Oracle FTP site. Go to:

ftp://oracle-ftp.oracle.com and select "server", "wgt-tech", "server", and "windowsNT"

</li> <li>Install the latest Oracle Server software on your Oracle Database Server System.

If the Microsoft Transaction Server application accesses an Oracle database on a Windows NT or UNIX system, make sure that the latest Oracle patch is installed on that system.

You can obtain the latest Oracle patches for Windows NT from the Oracle FTP site. Go to:

ftp://oracle-ftp.oracle.com and select "server", "wgt-tech", "server", and "windowsNT"

</li> <li>Use the Microsoft Oracle ODBC Driver.

Make certain that Microsoft Transaction Server is using the Microsoft Oracle ODBC driver. No other Oracle ODBC driver supports Microsoft Transaction Server transactions.

You must install one of the following Microsoft Oracle ODBC drivers if you wish to use Microsoft Transaction Server transactions from an Intel x86 platform.

You must install the Microsoft Oracle ODBC 2.5 driver version 2.573.2927, if you want to use Microsoft Transaction Server transactions from a Compaq Alpha platform. Earlier versions of the Microsoft Oracle ODBC driver did not support the Compaq Alpha platform.

You can obtain the Microsoft Oracle ODBC Driver 2.5 from:

http://microsoft.com/data by following the "Downloads" link.

If you wish to access an Oracle database, we suggest that you use the Microsoft Oracle ODBC Driver 2.0 or later driver even if you do not require transaction support. This new driver offers better performance than the Microsoft Oracle ODBC 1.0 driver it replaced The Oracle 1.0 driver serialized all activity at the driver level; requests were single-threaded through the driver. The Microsoft Oracle 2.0 and later drivers serialize all activities at the connection level. This allows different database connections to be used in parallel.</li> <li>Make sure that Oracle XA support is enabled.

Check to be sure that Oracle XA transaction support has been enabled. For more information, refer to the section titled "Enabling Oracle XA Transaction Support" in the "Using Oracle Databases with Microsoft Transaction Server" document.

<ol style="list-style-type: lower-alpha;"> <li>If you are using Oracle 7.3, make sure that V$XATRANS$ exists. This view should have been created when the XA library was installed. If this view does not exist, your Oracle system administrator must create it by running the Oracle-supplied script named "XAVIEW.SQL". This file can be found in C:\ORANT\RDBMS73\ADMIN. This SQL script must be executed as the Oracle user "SYS".

If you are using Oracle8, this view should exist. You should not need to create it.</li> <li> For both Oracle 7.3 and Oracle8, the Oracle system administrator must grant SELECT access to the public on the DBA_PENDING_TRANSACTIONS view. Grant Select on V$XATRANS$ to public. </li> <li>In the Oracle Instance Manager, click Advanced Mode on the View menu and select "Initialization Parameters" in the left-pane. In the right-pane, select "Advanced Tuning" and increase the "distributed_transactions" parameter to allow more concurrent MTS transactions to update the database at a single time.</li></ol>

Consult your Oracle Server documentation for more information about configuring Oracle XA transaction support.</li> <li>Make sure that Oracle numeric characters are configured correctly.

Warning Using Registry Editor incorrectly can cause serious problems that may require you to reinstall your operating system. Microsoft cannot guarantee that problems resulting from the incorrect use of Registry Editor can be solved. Use Registry Editor at your own risk.

For information about how to edit the registry, view the "Changing Keys And Values" Help topic in Registry Editor (Regedit.exe) or the "Add and Delete Information in the Registry" and "Edit Registry Data" Help topics in Regedt32.exe. Note that you should back up the registry before you edit it.

Customers who have systems located outside the United States may need to configure Oracle numeric character support. In the Windows NT registry, locate the following registry key:

and add this entry:

<pre class="fixed_text">"NLS_NUMERIC_CHARACTERS"=".,"

NOTE: The characters inside the quoted string above are a period and a comma, in that order.</li> <li>Make sure that Oracle is configured with adequate connections.

If you want to create more than a few dozen connections to an Oracle database, ensure that Oracle is configured to support additional database connections. For more information, refer to the section titled "Configuring Oracle to Support a Large Number of Connections" in the document "Using Oracle Databases with Microsoft Transaction Server" .</li> <li>Make sure that you have a connection to the Oracle database if you use Oracle Integrated Security.

If you use Oracle Integrated Security, make certain that MS DTC is running under a login ID and password that is authorized to connect to the Oracle database. For more information, refer to the section titled "Configuring Integrated Security" in the document "Using Oracle Databases with Microsoft Transaction Server".</li> <li>Run the TestOracleXAConfig program.

Run the TestOracleXAConfig program to make sure that you can successfully connect to the Oracle database without using Microsoft Transaction Server. For more information, refer to the section titled "Testing Installation and Configuration of MTS Support for Oracle" in the "Using an Oracle Database with Microsoft Transaction Server" document.</li> <li>Run the Sample Bank program.

Run the Sample Bank program to make sure that you can successfully connect to the Oracle database from a Microsoft Transaction Server program. For more information, refer to the section titled "Validating Oracle Installation and Configuration Using the Sample Bank Application" in the document "Using Oracle Databases with Microsoft Transaction Server".</li> <li>Enable Oracle Tracing.

Oracle is capable of generating trace files that record the information sent between the Oracle client and server. These trace files can be extremely helpful in diagnosing problems. You can make sure Oracle tracing as follows: <ol style="list-style-type: lower-alpha;"> <li>Make that the Mtxoci.dll installed on your MTS system is version 1998.08.762.0 or later. Version 1998.08.762.0 was released with the NT4 Service Pack 4 release. It was the first version of the Mtxoci.dll that allows you to enable Oracle tracing and control the location of Oracle trace files.</li> <li>Use the Explorer to find and delete any existing Oracle trace files on your system. These files have names ending with the suffix ".trc". By deleting any obsolete trace files, you make it easier to find any newly created ones.</li> <li> Run REGEDIT to create the following registry key: <pre class="fixed_text">HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Transaction Server\Local Computer\My Computer\OracleTraceFilePath Give this key the following REG_SZ value: <pre class="fixed_text">C:\OraTrace+DbgFl=7 You may choose a different disk drive and directory for the trace files if you want. </li> <li>Use the Explorer to create the Oracle trace file directory. In our example, create the directory "OraTrace" on the "C" drive.</li> <li>Stop the MTS package that is accessing the Oracle database. By stopping the package you ensure that all existing Oracle database connections are closed and that new Oracle database connections are opened when the MTS component is next invoked. These newly opened Oracle database connections have Oracle tracing enabled.</li> <li>Invoke the Microsoft Transaction Server component that is opening the Oracle database.</li> <li>Examine the newly created Oracle trace files.</li></ol> </li> <li>Enable MTS/Oracle Error Tracing

MTS is capable of capturing additional information regarding Oracle errors in the Windows Application Event log. You can capture this information as follows: <ol style="list-style-type: lower-alpha;"> <li> Run REGEDIT to create the following registry key: <pre class="fixed_text">HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\IniFileMapping\MTx.Ini\TRACE </li> <li>Stop the MTS package that is accessing the Oracle database. By stopping the package you ensure that the Mtxoci.dll performs tracing when it is restarted.</li> <li>Invoke the Microsoft Transaction Server component that is opening the Oracle database.</li> <li>Use the Windows Event Viewer to examine the Application event log. Look for events generated by MTXOCI. You may see events like the following:

String message: sqlld2 call failed with error 0x849.

The error value is displayed in octal. You can use the Calculator program to convert the error value into decimal. In this example, "0x849" translates into the Oracle error value 2121.</li></ol> </li> <li>Check Transaction time-out.

Consider whether the Microsoft Transaction Server component's transaction may have ended before the database enlistment completed. This may occur if the transaction time-out expires before the Oracle database enlistment completes.

You can increase the transaction time-out value through the Microsoft Transaction Server Explorer. To do this, use these steps:

<ol style="list-style-type: lower-alpha;"> <li>Run Microsoft Transaction Server Explorer and select Computers.</li> <li>Right-click the computer where the transaction was initiated and select Properties on the shortcut menu.</li> <li>Select the Options tab and specify a longer time-out value.</li></ol>

This is unlikely to be the problem unless your transactions last for more than one minute. However, it may be helpful to temporarily increase the time-out value to eliminate this as a potential source of trouble.</li></ol>

What to Do If You Still Get This Error
If you still get this error after doing everything described here, you should report the error to the Microsoft Product Support organization. Please supply the following information with your problem report. <ol> <li>Describe the problem. Does the "Failed to Enlist" error occur every time you attempt to use Microsoft Transaction Server transactions or is the failure intermittent? If the failure is intermittent, how often does it occur?</li> <li>Describe your application and system configuration. <ol style="list-style-type: lower-alpha;"> <li>Describe the system the Microsoft Transaction Server application components are installed on. If you are using an Oracle database, provide the version of both the Oracle client software and the Microsoft Oracle ODBC driver are you using.</li> <li>Are you using a Microsoft SQL database or an Oracle database? Is the database on the same computer as the Microsoft Transaction Server application components or is it on a separate computer? If you are using an Oracle database, what kind of system is the Oracle database installed on and what version of Oracle software is installed?</li> <li>What network transport are you using: TCP/IP, Named Pipes, IPX/SPX, and so forth? What name service are you using: WINS, DNS, Host files, and so on?</li></ol> </li> <li>Does the TestOracleXAConfig program run?

If you are using an Oracle database, try to run the TestOracleXAConfig program. If this program fails, the problem lies with Oracle. Please report the problem to Oracle Customer Support.</li> <li>Does the Sample Bank program run?

Try to run the Sample Bank program with Microsoft SQL Server. If you are using an Oracle database, does the Sample Bank application run with Oracle? If not, what error are you experiencing?</li> <li>What errors are reported in the Oracle trace files?

If you are using an Oracle database, what information is present in the Oracle trace files? To capture this information, first find and deleting all existing Oracle trace files on the system. These files have names ending with the .trc extension. After you delete all existing trace files, run the failing Microsoft Transaction Server component and provide Microsoft with the contents of the Oracle trace files.</li> <li>What errors are reported in the Windows NT event log?

Check the Windows NT event log and report all DTC events that were recorded at or near the time of the failure.</li> <li>Are you using Oracle Integrated Security?

Report whether you are using Oracle Integrated Security.</li> <li>What is the transaction time-out value?

Please tell Microsoft what transaction time-out value is configured in Microsoft Transaction Server.</li></ol>

<div class="references_section">