Счет транзакции после EXECUTE указывает на отсутствие инструкции COMMIT или ROLLBACK TRANSACTION - SQL Server 2005
Я получаю сообщение об ошибке из приложения следующим образом с SQL Server 2005
"Счет транзакции после EXECUTE указывает, что COMMIT или ROLLBACK Отсутствует инструкция TRANSACTION. Предыдущий счетчик = 1, текущий счет = 0"
Как я могу найти этап, на котором возникает эта ошибка?
Как я могу найти недостающую транзакцию или хранимую процедуру, где она не была выполнена или откат?
Ответы
Ответ 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
ее.