![](/img/trans.png)
[英]Using parameter in query results in BEGIN / COMMIT mismatch SQLException
[英]SQLException - Transaction BEGIN / COMMIT mismatch
您是否遇到过确实具有平衡事务块的存储过程的此异常?
我仔细检查了存储过程,它只有一个TRANSACTION BEGIN
和cooresponding 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的检查
是的,它会的。 每个BEGIN增加@@trancount
,每个提交减少它。 只有当计数达到0时,事务才真正提交。 作为呼叫者,您的程序无法控制此操作。 调用过程的作用是正常运行并平衡BEGIN和COMMIT计数,如果任何被调用的过程有不平衡,您将看到此错误。
你确定你没有产生这个的路径吗?
BEGIN TRAN
ROLLBACK TRAN
COMMIT TRAN
是的,你走的是正确的道路。 如果嵌套过程调用创建事务,则它们会影响调用过程。
检查其他程序
确保你没有无意中写过
return
commit
代替
commit
return
对我来说,这就是问题所在。
在PROCEDURE创建文本之上添加它
SET XACT_ABORT ON;
它将确保如果没有执行任何操作,则事务将完全中止。
MSDN Doc: http : //technet.microsoft.com/en-us/library/ms188792(v = sql.105).aspx
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.