SQLException - несоответствие транзакции BEGIN / COMMIT - PullRequest
6 голосов
/ 16 сентября 2010

Сталкивались ли вы с этим исключением для хранимой процедуры, которая действительно имеет сбалансированный блок транзакций?

Я дважды проверил хранимую процедуру, и она имеет ровно одну 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 ]

14 голосов
/ 16 сентября 2010

Да, будет. Каждый BEGIN увеличивает @@trancount, каждый коммит уменьшает его. Только когда счет достигнет 0, транзакция действительно будет зафиксирована. Ваша процедура как вызывающая сторона не может это контролировать. Задача вызываемых процедур состоит в том, чтобы вести себя правильно и сбалансировать счет BEGIN и COMMIT. Если какая-либо из вызванных процедур имеет дисбаланс, вы увидите эту ошибку.

6 голосов
/ 16 сентября 2010

Вы уверены, что у вас нет пути, который производит это

BEGIN TRAN

ROLLBACK TRAN

COMMIT TRAN
2 голосов
/ 16 сентября 2010

Да, вы идете по правильному пути. Если вызов вложенной процедуры создает транзакции, они влияют на вызывающую процедуру.

Проверьте, что другая процедура

1 голос
/ 28 октября 2014

Убедитесь, что вы случайно не написали

 return
 commit

вместо

 commit
 return

Для меня это была проблема.

0 голосов
/ 03 декабря 2013

Добавьте это поверх текста создания PROCEDURE

SET XACT_ABORT ON;

Это гарантирует, что если ничего не будет выполнено, транзакция будет прервана полностью.

MSDN Doc: http://technet.microsoft.com/en-us/library/ms188792(v=sql.105).aspx

...