How to fix Error 3903 on Windows Server 2025 / Windows 11

Troubleshooting Guide: Error 3903 — “The ROLLBACK TRANSACTION Request Has No Corresponding BEGIN TRANSACTION”

Why This Error Happens

This error occurs when a ROLLBACK TRANSACTION statement executes without a matching active transaction (@@TRANCOUNT = 0) in the current session scope. It is typically caused by mismatched BEGIN...COMMIT...ROLLBACK logic in stored procedures, nested transactions that were already committed or rolled back earlier, or a TRY...CATCH block attempting to roll back after a transaction was auto-terminated by a prior error (e.g., with XACT_ABORT ON). In Microsoft SQL Server 2025, this can also surface due to connection pooling reusing a session where transaction state wasn’t properly reset by the client application.

Step-by-Step Resolution Guide

Step 1: Audit the Transaction Block Logic in the Failing Script/Procedure

  • Open the stored procedure or T-SQL script in SQL Server Management Studio (SSMS) 21 or Azure Data Studio.
  • Search for every BEGIN TRANSACTION, COMMIT, and ROLLBACK keyword and manually trace the logical flow to find unbalanced pairs.
  • Pay close attention to early RETURN statements inside IF blocks that might skip a COMMIT but leave a ROLLBACK reachable later.

Step 2: Check @@TRANCOUNT Before Rolling Back

  • Modify the CATCH block to verify an active transaction exists before issuing the rollback.
  • Use the following conditional pattern:
  IF @@TRANCOUNT > 0
      ROLLBACK TRANSACTION;
  • Deploy this change via sqlcmd -S localhost -d YourDB -i FixedProcedure.sql or redeploy the project via SSDT.

Step 3: Verify XACTABORT and XACTSTATE Settings

  • Add SET XACT_ABORT ON; at the top of the procedure to ensure SQL Server automatically terminates and rolls back a transaction on a runtime error, preventing orphaned “doomed” transactions.
  • Inside the CATCH block, check XACT_STATE() to distinguish between an active transaction (1), a doomed transaction (-1), and no transaction (0).
  • Example check: IF (XACT_STATE()) = -1 ROLLBACK TRANSACTION;

Step 4: Restart the SQL Server Service to Clear Session State

  • If the error persists due to a corrupted connection pool state on Windows Server 2025, open Services.msc.
  • Locate SQL Server (MSSQLSERVER) or your specific named instance.
  • Right-click and select Restart to clear all active session variables and orphaned connections.

Alternative or Verification Steps

  • Verify the Fix: Run the updated stored procedure in a new query window and force an error mid-transaction to confirm the CATCH block exits gracefully without throwing Error 3903.
  • Alternative Check: If the error originates from an application (e.g., .NET or Python), ensure the connection string does not have Enlist=true combined with conflicting TransactionScope objects in the C# code, as this can cause the client to send a rollback for a transaction the server already closed.