Подтвердить что ты не робот

Счет транзакции после EXECUTE указывает на отсутствие инструкции COMMIT или ROLLBACK TRANSACTION - SQL Server 2005

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

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

Как я могу найти этап, на котором возникает эта ошибка?

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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