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:
- Hit
Win + R, typecomexp.msc, press Enter. - Expand “Component Services” → “Computers” → “My Computer” → “Distributed Transaction Coordinator” → “Local DTC”.
- Right-click “Local DTC” and choose “Properties”.
- Go to the Security tab.
- Check these boxes:
- Network DTC Access
- Allow Inbound
- Allow Outbound
- No Authentication Required (if both servers are in same domain and trusted) - If you’re using domain accounts, check “Mutual Authentication Required” instead. But for small businesses without a domain, “No Authentication” works fine.
- Under “Transaction Manager Communication”, set it to “Allow Inbound/Outbound”.
- 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:
- Open “Windows Defender Firewall with Advanced Security”.
- Create an inbound rule for port 135 (TCP). Make sure it allows traffic from the other SQL server’s IP range.
- Create a rule for dynamic ports: TCP ports 49152-65535 (or 1024-65535 on older Windows like 2008).
- Also allow “Distributed Transaction Coordinator” as a program rule – it’s at
C:\Windows\System32\msdtc.exe. - 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.