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

Why This Error Happens

Error 3993 occurs when a trigger, user-defined function, or stored procedure begins an explicit transaction (via BEGIN TRAN) but the routine terminates—either by completing execution or hitting an unhandled exception—before issuing a matching COMMIT or ROLLBACK. SQL Server 2025 enforces strict transaction nesting rules, so any mismatch between @@TRANCOUNT at the start and end of the routine triggers this error to prevent orphaned transactions. This is almost always a code-level issue rather than a server configuration problem, often surfacing after a migration to SQL Server 2025 due to its updated transaction validation engine.

Step-by-Step Resolution Guide

Step 1: Identify the Offending Routine

  • Check the SQL Server error log (via SSMS or xp_readerrorlog) for the exact stored procedure, trigger, or function name referenced in the 3993 message.
  • Use DBCC INPUTBUFFER(<session_id>) or Extended Events to capture the exact statement that caused the failure in real time.
  • Note the @@TRANCOUNT value logged alongside the error for context on how deep the nesting went.

Step 2: Audit the Transaction Logic in the Code

  • Open the routine in SSMS or Azure Data Studio and search for BEGIN TRAN, COMMIT, and ROLLBACK keywords.
  • Verify every code branch (including CATCH blocks, early RETURN statements, and IF/ELSE conditions) has a corresponding COMMIT or ROLLBACK for every BEGIN TRAN.
  • Pay special attention to nested triggers or procedures calling other procedures that also manage transactions—this is the most common cause of mismatched counts.

Step 3: Implement TRY…CATCH with Proper Rollback Handling

  • Wrap the transactional logic in a BEGIN TRY...END TRY / BEGIN CATCH...END CATCH block.
  • Inside the CATCH block, add:
IF @@TRANCOUNT > 0
    ROLLBACK TRANSACTION;
  • Ensure SET XACT_ABORT ON; is declared at the top of the procedure/trigger to force automatic rollback on severe errors, reducing the chance of a dangling transaction state.

Step 4: Test in an Isolated Environment

  • Deploy the corrected routine to a Windows Server 2025 test instance or a local Windows 11 development environment with SQL Server 2025 installed.
  • Run the original failing transaction/workload against the patched code and monitor @@TRANCOUNT before and after execution using PRINT or SELECT @@TRANCOUNT debug statements.

Step 5: Deploy and Monitor in Production

  • Push the validated script to production during a low-traffic maintenance window.
  • Enable SQL Server Agent alerts for Error 3993 (Severity 16) so any recurrence is immediately flagged via email or SCOM notification.

Alternative or Verification Steps

  • Run DBCC OPENTRAN on the affected database immediately after reproducing the workload to confirm no transaction is left open.
  • If the error persists despite code fixes, temporarily enable Trace Flag 3609 on a test instance to get verbose transaction-state logging, which helps pinpoint exactly where the trancount drifts.