Счетчик транзакций после EXECUTE указывает, что отсутствует оператор COMMIT или ROLLBACK TRANSACTION - SQL Server 2005 - PullRequest
12 голосов
/ 15 февраля 2010

Я получаю сообщение об ошибке из приложения, как указано ниже с SQL Server 2005

"Количество транзакций после EXECUTE указывает, что COMMIT или ROLLBACK Операция TRANSACTION отсутствует. Предыдущий счет = 1, текущий счет = 0"

Как найти стадию возникновения этой ошибки?

Как найти отсутствующую транзакцию или хранимую процедуру, где она не зафиксирована или не откатывается?

Ответы [ 4 ]

15 голосов
/ 15 февраля 2010

Я не думаю, что ничего не хватает. Вероятно, это внутренняя хранимая процедура, которая вызывается из транзакции (TRANCOUNT = 1), запускает собственную транзакцию (TRANCOUNT = 2) и затем откатывает ее обратно. Что ж, это означает откат, но откат влияет на все транзакции, а не только на самые внутренние, поэтому процедура запутывает поток выполнения.

Способ найти место зависит от доступных инструментов / навыков. Лучше использовать SQL Profiler, который показывает все команды, выполняемые приложением на сервере. Найдите самую внешнюю хранимую процедуру и просмотрите ее код в поисках любых других вызовов процедур.

3 голосов
/ 15 февраля 2010

Системная функция @@TRANCOUNT будет возвращать количество транзакций, в которых вы находитесь. В качестве части вашего расследования вставьте операторы PRINT @@TRANCOUNT или SELECT @@TRANCOUNT в соответствующие места, чтобы увидеть, что происходит не так.

1 голос
/ 29 августа 2012

Проверьте, есть ли у вас команда возврата до COMMIT TRAN или ROLLBACK TRAN. Это обычная ошибка, потому что команда Return завершает процедуру, и у нее нет шансов COMMIT.

1 голос
/ 15 февраля 2010

, что обычно означает, что у вас были вложенные транзакции и произошел откат. вы на самом деле не предоставляете никакой информации о выполняющемся коде, хранимых процедурах, динамическом SQL и т. д. Так что это всего лишь предположение, но я бы сделал поиск «ROLLBACK» и добавлял PRINT или INSERTs INTO YourErrorLogTable после каждого, убедитесь, что контент достаточно уникален, чтобы определить, что было выполнено. Еще вы можете попробовать добавить блоки TRY - CATCH, в которые вы включили PRINT или INTO YourErrorLogTable в CATCH. Если вы предоставите более подробную информацию о вызываемом коде (вложенные процедуры, используете ли вы блоки try-catch, динамический sql, linq и т. Д.), Я мог бы дать вам более конкретные советы о том, как найти проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...