【问题标题】:SQLException - Transaction BEGIN / COMMIT mismatchSQLException - 事务开始/提交不匹配
【发布时间】:2010-09-16 16:50:59
【问题描述】:

对于确实具有平衡事务块的存储过程,您是否遇到过这种异常?

我仔细检查了存储过程,它只有一个 TRANSACTION BEGIN 和对应的 TRANSACTION END

错误记录

SqlException - Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 1, current count = 0.  The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION. - Delete failed - stack:    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)     at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)     at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)     at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)     at System.Data.SqlClient.S ... [Rest of stack trace truncated by logging system]`

其他信息

存储过程确实包含对另一个存储过程的EXEC 调用。这里的交易对不匹配是否会导致错误以这种方式浮出水面?

更新 事实证明,嵌套存储过程中违反了外键约束。外部事务不包含 Try/Catch 块,并且指定了 SET XACT_ABORT ON,它没有正确处理提交或回滚。在尝试回滚之前还添加了对 @@TransactionCount > 0 的检查

【问题讨论】:

  • 外键约束在这里对我有很大帮助!我在 python 中遇到了与 sqlalchemy 类似的问题

标签: sql sql-server-2008 transactions sqlexception


【解决方案1】:

是的。每个 BEGIN 递增 @@trancount,每次提交递减它。只有当计数变为 0 时,事务才真正提交。作为调用者,您的过程无法控制这一点。被调用程序的工作是正常运行并平衡 BEGIN 和 COMMIT 计数,如果任何被调用程序存在不平衡,您将看到此错误。

【讨论】:

【解决方案2】:

你确定你没有产生这个的路径

BEGIN TRAN

ROLLBACK TRAN

COMMIT TRAN

【讨论】:

    【解决方案3】:

    是的,你走在正确的道路上。如果嵌套过程调用创建事务,它们会影响调用过程。

    检查其他程序

    【讨论】:

      【解决方案4】:

      确保你没有不小心写了

       return
       commit
      

      代替

       commit
       return
      

      对我来说,这就是问题所在。

      【讨论】:

        【解决方案5】:

        将此添加到 PROCEDURE 创建文本的顶部

        设置 XACT_ABORT 开启;

        它将确保如果没有执行任何操作,则事务将完全中止。

        MSDN 文档: http://technet.microsoft.com/en-us/library/ms188792(v=sql.105).aspx

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-21
          • 1970-01-01
          • 1970-01-01
          • 2020-06-26
          相关资源
          最近更新 更多