SQLException - 事务BEGIN / COMMIT不匹配

时间:2010-09-16 16:50:59

标签: sql sql-server-2008 transactions sqlexception

您是否遇到过确实存在平衡事务块的存储过程的异常?

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

5 个答案:

答案 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