6

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

我仔细检查了存储过程,它正好有一个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 的检查

4

5 回答 5

14

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

于 2010-09-16T17:01:30.350 回答
6

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

BEGIN TRAN

ROLLBACK TRAN

COMMIT TRAN
于 2010-09-16T17:04:27.953 回答
2

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

检查其他程序

于 2010-09-16T17:00:49.730 回答
1

确保你没有无意中写到

 return
 commit

代替

 commit
 return

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

于 2014-10-28T17:36:54.637 回答
0

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

设置 XACT_ABORT 开;

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

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

于 2013-12-03T12:48:34.323 回答