繁体   English   中英

SQLException - 事务BEGIN / COMMIT不匹配

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM