Mismatched BEGIN-COMMIT Counts: Transaction Count Error
In a scenario where a stored procedure calls another stored procedure within an EXECUTE statement, an error may occur if the transaction count mismatch. The following error message illustrates this issue:
Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 1, current count = 0
Root Cause
This error typically occurs when the caller stored procedure starts a transaction (with BEGIN) and the callee stored procedure does not properly handle transaction exceptions.
Investigation
Upon review of the code, it was discovered that the callee stored procedure was not checking for transaction abortions or uncommitted transactions within its TRY/CATCH block. When an exception occurs, the transaction should be properly handled.
Solution
To resolve this issue, the callee stored procedure should be modified to include proper handling of transaction state. The following example demonstrates the recommended approach:
CREATE PROCEDURE [usp_my_procedure_name] AS BEGIN SET NOCOUNT ON; DECLARE @trancount INT; SET @trancount = @@TRANCOUNT; BEGIN TRY IF @trancount = 0 BEGIN TRANSACTION ELSE SAVE TRANSACTION usp_my_procedure_name; -- Do the actual work here label exit: IF @trancount = 0 COMMIT; END TRY BEGIN CATCH DECLARE @error INT, @message VARCHAR(4000), @xstate INT; SELECT @error = ERROR_NUMBER(), @message = ERROR_MESSAGE(), @xstate = XACT_STATE(); IF @xstate = -1 ROLLBACK; IF @xstate = 1 AND @trancount = 0 ROLLBACK IF @xstate = 1 AND @trancount > 0 ROLLBACK TRANSACTION usp_my_procedure_name; RAISERROR ('usp_my_procedure_name: %d: %s', 16, 1, @error, @message); END CATCH END GO
Additional Resources
The above is the detailed content of How to Fix 'Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements' Errors in Stored Procedures?. For more information, please follow other related articles on the PHP Chinese website!