0XC0190043

SQL Server Transaction Promotion Fails: 0XC0190043 Fix

This error hits when trying to promote a local transaction to a distributed one in SQL Server. Happens often with linked servers or DTC issues. Fix it by checking network, DTC config, and SQL Server settings.

When This Error Pops Up

You’re running a query that hits multiple SQL Server instances – maybe a INSERT INTO [Server2].[Database].[dbo].[Table] from a local query, or a stored procedure that joins data from a linked server. Suddenly, you get this:

Msg 1206, Level 18, State 0
The Microsoft Distributed Transaction Coordinator (MS DTC) has cancelled the distributed transaction.

Or the exact error: 0XC0190043. It means SQL Server tried to promote your local transaction to a distributed one (because it involved another server), but the promotion failed. I saw this last month at a logistics company – they had a nightly batch job that synced inventory between two SQL boxes. It worked for years, then one update broke it. The error came out of nowhere during a routine update.

What’s Really Going On

SQL Server uses something called transaction promotion. Normally, a transaction stays local to one database. But when you touch another server (like through a linked server), SQL Server says “whoa, I need to coordinate this across machines” and promotes it to a distributed transaction. That involves MSDTC (Microsoft Distributed Transaction Coordinator).

The error 0XC0190043 means MSDTC couldn’t complete the promotion. Common reasons:

  • MSDTC service isn’t running on one or both servers.
  • Firewall blocks DTC traffic (port 135 and dynamic ports).
  • Network authentication fails – like using a local account instead of domain credentials.
  • DTC security settings are too strict – only allow inbound or outbound, not both.
  • DNS or name resolution issues – the servers can’t find each other by name.

The root cause is almost always a configuration mismatch. Don’t waste time reinstalling SQL Server – it’s not a database corruption issue.

How to Fix It – Step by Step

Step 1: Check MSDTC is Running

On both servers (the one running the query and the target linked server), open Services (services.msc). Look for “Distributed Transaction Coordinator”. Make sure it’s set to Automatic and Started. If it’s stopped, right-click and start it. If it’s not installed, you’ll need to add the feature via Server Manager (under “Distributed Transaction Coordinator” in Features).

Step 2: Configure DTC Security

Open Component Services:

  1. Hit Win + R, type comexp.msc, press Enter.
  2. Expand “Component Services” → “Computers” → “My Computer” → “Distributed Transaction Coordinator” → “Local DTC”.
  3. Right-click “Local DTC” and choose “Properties”.
  4. Go to the Security tab.
  5. Check these boxes:
    - Network DTC Access
    - Allow Inbound
    - Allow Outbound
    - No Authentication Required (if both servers are in same domain and trusted)
  6. If you’re using domain accounts, check “Mutual Authentication Required” instead. But for small businesses without a domain, “No Authentication” works fine.
  7. Under “Transaction Manager Communication”, set it to “Allow Inbound/Outbound”.
  8. Click OK, then restart the MSDTC service (or reboot the server).

Step 3: Open Firewall Ports

DTC uses port 135 for RPC, plus a range of dynamic TCP ports. On Windows Firewall:

  1. Open “Windows Defender Firewall with Advanced Security”.
  2. Create an inbound rule for port 135 (TCP). Make sure it allows traffic from the other SQL server’s IP range.
  3. Create a rule for dynamic ports: TCP ports 49152-65535 (or 1024-65535 on older Windows like 2008).
  4. Also allow “Distributed Transaction Coordinator” as a program rule – it’s at C:\Windows\System32\msdtc.exe.
  5. Do this on both servers for inbound traffic.

Step 4: Test DTC Communication

From the server running the query, open PowerShell or Command Prompt and run:

net start msdtc

Then test DTC with a simple linked server query. But first, verify the linked server exists and works without transactions:

SELECT * FROM [Server2].[Database].[dbo].[Table] WHERE 1=0;

If that works, try a transaction:

BEGIN DISTRIBUTED TRANSACTION;
SELECT * FROM [Server2].[Database].[dbo].[Table];
COMMIT TRANSACTION;

If it fails with 0XC0190043 again, you’ve still got a DTC config issue.

Step 5: Check DNS and Name Resolution

Sometimes the servers can’t resolve each other’s hostnames. On both servers, run:

ping ServerName
nslookup ServerName

If they fail, add entries to the C:\Windows\System32\drivers\etc\hosts file. For example:

192.168.1.100 SQLServer1
192.168.1.101 SQLServer2

Step 6: Update SQL Server’s Linked Server Config

In SQL Server Management Studio, right-click the linked server → Properties. Go to the “Server Options” tab. Set:

  • RPC Out: True
  • RPC: True
  • Use Remote Collation: False (unless you need it)

Also under “Security”, make sure you’re using a login that has permissions on both servers. Using SA is easiest for testing, but switch to a domain account later.

Still Failing? Check This

If the error persists, check the Windows Event Log (Application and System) on both servers. Look for MSDTC events with ID 4099 or 4241 – they often say “communication with the remote transaction manager failed”. That points to a network or firewall issue.

Also try disabling firewalls temporarily on both servers (just for testing). If it works, you know it’s a firewall rule. Re-enable and tighten the rules.

Another trick: use a loopback linked server – make a linked server pointing back to itself (SQLServer1 to SQLServer1). If that fails, the issue is local DTC config, not networking.

I had a client whose antivirus blocked DTC. Symantec Endpoint Protection had a “network threat protection” feature that killed DTC traffic. Temporarily disable the AV’s network module to test.

Last resort: restart both servers. Sounds dumb, but I’ve seen DTC deadlocks that only a reboot clears.

Related Errors in Database Errors
Connection refused Database Connection Refused After Server Migration — Real Fixes There is insufficient system memory in resource pool 'internal' to run this quer Fix SQL Server 'insufficient system memory in resource pool internal' 0X8004D00D XACT_E_NOTCURRENT (0X8004D00D) Fix: Transaction Not Current could not fork new process for connection: Cannot allocate memory Fix 'Cannot allocate memory' in PostgreSQL on Linux

Was this solution helpful?

EP
Erropedia Team
Tech Support Editors
The Erropedia editorial team researches and documents real-world tech errors from across Windows, Linux, macOS, networking, databases, cloud platforms, and more. Every solution is reviewed for accuracy and updated as software and systems evolve.