When you see this error
You're running a query that talks to a linked server or does a remote stored procedure call. Everything seems fine for a few seconds, then SQL Server throws STATUS_TRANSACTION_NO_RELEASE (0XC0000211). The message says "The transport did not receive a release for a pending response". This usually happens when the remote server doesn't send back a DONE token in time, or the connection drops mid-transaction.
Had a client last month who got this every time they ran cross-server joins. Turned out the remote SQL Server had a firewall rule that killed idle connections after 30 seconds – the transport never got the release signal.
Root cause – plain English
Think of it like a delivery guy who rings your doorbell and expects you to sign for a package. If you don't answer, he stands there holding the package forever. The transport layer (the delivery guy) is waiting for a release signal from the remote server, but something blocks it – maybe the remote server is overloaded, a transaction is stuck, or the network cable got unplugged.
Internally, SQL Server tracks open transactions using a resource called transaction descriptor. When a remote call finishes, the transport sends a release command. If that release never arrives, the descriptor stays locked and the error pops up.
Fix – step by step
Step 1: Find the blocking session
Run this query on the server where you got the error:
SELECT session_id, blocking_session_id, wait_type, wait_time, last_wait_type FROM sys.dm_exec_requests WHERE blocking_session_id > 0;
Look for sessions with wait_type TRAN_MARK_LOCK_UPDATE or LCK_M_SCH_M. That's your blocking session.
Step 2: Kill the blocking session
Once you have the session_id, kill it with:
KILL <session_id>;
Don't skip this – the error won't clear by itself. I once had a client refuse to kill sessions because they thought it would corrupt data. It won't. It just rolls back the transaction.
Step 3: Reset the connection
Sometimes the transport layer stays in a bad state even after killing the session. You need to break the connection:
- In SQL Server Management Studio, right-click the server and select Activity Monitor.
- Find the connection with the error (look for last_wait_type = 0XC0000211).
- Right-click and select Kill Process.
Step 4: Check linked server config
If this keeps happening, the remote server might be timing out. Open the linked server properties in SSMS:
- Go to Server Objects > Linked Servers.
- Right-click your linked server and choose Properties.
- Increase Query Timeout to at least 600 seconds (10 minutes).
- Also set Remote Proc Transaction to False – this disables distributed transactions which often cause the hang.
Step 5: Test with a simple query
Run this to see if the fix works:
SELECT * FROM OPENQUERY([your_linked_server], 'SELECT 1 AS test');
If it returns results, the transport is working again. If you still get 0XC0000211, move to the next section.
If it still fails
Check these three things:
- Firewall rules – Some firewalls drop idle connections after a timeout. Set the firewall to keep the connection alive longer (try 5 minutes).
- SQL Server logs – Look in the SQL Server error log for messages about transport connection closed or login timeout expired. That tells you the remote side is dropping the connection.
- Remote server load – If the remote SQL Server is under heavy load, it might not release transactions fast enough. Run
sp_who2 'active'on the remote server to see if it's overwhelmed.
One last trick: restart the SQL Server service on both ends. Yes, it's blunt, but it clears any lingering transport state that doesn't show up in sys.dm_exec_requests. Had a client last week who spent three hours debugging, and a restart fixed it in 30 seconds.