Вы сталкивались с этим исключением для хранимой процедуры, которая действительно имеет сбалансированный блок транзакции?
Я дважды проверил хранимую процедуру и он имеет ровно один 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 перед попыткой отката