当前位置: 首页 > 知识库问答 >
问题:

EXECUTE之后的事务计数表示BEGIN和COMMIT语句的数量不匹配。上一个计数=1,当前计数=0

慕承恩
2023-03-14

我有一个Insert存储过程,它将数据馈送到表1,并从表1获取列1值,并调用将馈送表2的第二个存储过程。

但是当我调用第二个存储过程时:

Exec USPStoredProcName

我得到以下错误:

“执行”之后的事务计数表示 BEGIN 和“提交”语句的数量不匹配。上一个计数 = 1,当前计数 = 0。

我已经阅读了其他此类问题的答案,无法找到提交计数究竟在哪里搞砸了。

共有3个答案

祖波光
2023-03-14

这通常发生在事务启动时,并且要么未提交,要么未回滚。

如果存储过程中出现错误,这可能会锁定数据库表,因为某些运行时错误导致事务未完成。在没有异常处理的情况下,可以使用如下异常处理。设置XACT_ABORT

SET XACT_ABORT ON
SET NoCount ON
Begin Try 
     BEGIN TRANSACTION 
        //Insert ,update queries    
     COMMIT
End Try 
Begin Catch 
     ROLLBACK
End Catch

来源

松思源
2023-03-14

我也有这个问题。对我来说,原因是我在做

return
commit

而不是

commit
return   

在一个存储过程中。

东门航
2023-03-14

如果您有一个TRY/CATCH块,则可能的原因是您正在捕获事务中止异常并继续。在CATCH块中,您必须始终检查<code>XACT_STATE()

我建议您仔细阅读异常处理和嵌套事务,它展示了一种可用于嵌套事务和异常的模式:

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

lbexit:
        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
 类似资料:
  • 问题内容: 我从SQL Server 2005的应用程序中获取错误,如下所示 “ EXECUTE之后的事务计数表明缺少COMMIT或ROLLBACK TRANSACTION语句。先前的计数= 1,当前的计数= 0” 我如何找到引发此错误的阶段? 如何找到丢失的事务或未提交或回滚的存储过程? 问题答案: 我认为没有什么丢失的。这可能是一个内部存储过程,该内部存储过程从事务内部进行调用(TRANCOU

  • 我有一个问题,很高兴收到你的反馈。在MySQL中更新我的表的数据时,出现以下消息: 该表为: INT NOT NULL AUTO_INCREMENT,VARCHAR(50)NOT NULL,日期NOT NULL,日期NOT NULL,INT NOT NULL,VARCHAR(10)NOT NULL,INT NOT NULL,主键 和代码: 和 提前感谢!

  • 问题内容: 我在和中遇到以下问题: 我调用以下javascript方法: 来自firebug的链接将如下所示: 根据以下链接: 错误:Sys.ParameterCountException:参数计数不匹配。 我设置 但我得到另一个错误 IE中不存在此问题。 编辑: 问题答案: 可能值得包装数据:用引号引起来的项目 变成

  • 问题内容: 如何查询以获取字段中匹配单词的数量,特别是在MySQL中。我只需要获取“搜索字词”出现在字段值中的次数即可。 例如,值是“一二一二”,所以当我搜索单词“一”时,它应该给我3 是否有可能?因为当前我只是从数据库中提取值,并使用服务器端语言进行计数。 谢谢 问题答案: 您可以创建一个可直接在SQL中使用的函数,以便一步一步完成所有操作。 这是我在MySQL网站上找到的函数: 您应该像这样使

  • 我认为第一个不可避免的步骤是做一个n个斐波那契数的数组,如下所示: 当然,我们可以通过只计算那些小于或等于n的斐波那契数来优化它,但这没有多大帮助,因为动态数组是不允许的。那么我们如何才能避免指数级的时间复杂度呢?

  • 我在尝试计算firestore读取计数时遇到了一些问题。firestore的读取计数总是以非常高的速度激增(每次我重新加载页面时,读取计数都会增加100个),尽管只有大约15个用户。即使我没有重新加载页面,firestore读取计数也会自动上升,这是因为订阅行为导致读取数据操作不时刷新吗?(我读过一些文章,建议如果用户只想提取一次数据,就使用“一次”)。 下面是代码片段(ts): firestor