首页 > 数据库 > mysql教程 > 如何修复存储过程中的'EXECUTE 后的事务计数表明 BEGIN 和 COMMIT 语句的数量不匹配”错误?

如何修复存储过程中的'EXECUTE 后的事务计数表明 BEGIN 和 COMMIT 语句的数量不匹配”错误?

DDD
发布: 2025-01-04 22:41:41
原创
325 人浏览过

How to Fix

BEGIN-COMMIT 计数不匹配:事务计数错误

在存储过程在 EXECUTE 语句中调用另一个存储过程的情况下,如果交易计数不匹配,可能会出现错误。以下错误消息说明了此问题:

Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 1, current count = 0
登录后复制

根本原因

当调用方存储过程启动事务(使用 BEGIN)并且被调用方时,通常会发生此错误存储过程不能正确处理事务

调查

检查代码后发现,被调用者存储过程没有检查其 TRY/CATCH 块中的事务中止或未提交的事务。发生异常时,应正确处理事务。

解决方案

要解决此问题,应修改被调用者存储过程以包括对事务状态的正确处理。以下示例演示了推荐的方法:

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
登录后复制

其他资源

  • [异常处理和嵌套事务](https://docs.microsoft.com/en-us/sql/t-sql/statements/begin-transaction-transact-sql?view=sql-server-ver15#exceptions-and-nested-transactions)

以上是如何修复存储过程中的'EXECUTE 后的事务计数表明 BEGIN 和 COMMIT 语句的数量不匹配”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板