【发布时间】:2010-09-16 16:50:59
【问题描述】:
对于确实具有平衡事务块的存储过程,您是否遇到过这种异常?
我仔细检查了存储过程,它只有一个 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 的检查
【问题讨论】:
-
外键约束在这里对我有很大帮助!我在 python 中遇到了与 sqlalchemy 类似的问题
标签: sql sql-server-2008 transactions sqlexception