您是否遇到过确实存在平衡事务块的存储过程的异常?
我仔细检查了存储过程,它只有一个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
答案 0 :(得分:14)
是的。每个BEGIN递增@@trancount
,每次提交减少它。只有当计数达到0时,事务才真正提交。作为呼叫者,您的程序无法控制此操作。被调用程序的工作是正常运行并平衡BEGIN和COMMIT计数,如果任何被调用的程序有不平衡,你会看到这个错误。
答案 1 :(得分:6)
您确定没有产生此
的路径吗?BEGIN TRAN
ROLLBACK TRAN
COMMIT TRAN
答案 2 :(得分:2)
是的,你走的是正确的道路。如果嵌套过程调用创建了事务,则它们会影响调用过程。
检查其他程序
答案 3 :(得分:1)
确保您没有无意中写过
return
commit
取代
commit
return
对我来说,那就是问题所在。
答案 4 :(得分:0)
在PROCEDURE创建文本
之上添加它SET XACT_ABORT ON;
它将确保如果没有执行任何操作,则事务将完全中止。
MSDN Doc: http://technet.microsoft.com/en-us/library/ms188792(v=sql.105).aspx