我正在从应用程序中的错误与SQL服务器以下2005事务计数后EXECUTE表示COMMIT或ROLLBACK TRANSACTION语句丢失 - SQL Server 2005的
“事务计数EXECUTE 后指示COMMIT或ROLLBACK TRANSACTION 声明丢失。 一个计数= 1,当前计数= 0"
我如何才能找到其中提出了这个错误的阶段?
如何找到丢失的事务或存储过程未提交或回滚的地方?
我正在从应用程序中的错误与SQL服务器以下2005事务计数后EXECUTE表示COMMIT或ROLLBACK TRANSACTION语句丢失 - SQL Server 2005的
“事务计数EXECUTE 后指示COMMIT或ROLLBACK TRANSACTION 声明丢失。 一个计数= 1,当前计数= 0"
我如何才能找到其中提出了这个错误的阶段?
如何找到丢失的事务或存储过程未提交或回滚的地方?
我不认为有任何遗漏。它可能是一个从事务内部调用的内部存储过程(TRANCOUNT = 1),启动自己的事务(TRANCOUNT = 2),然后将其回滚。那么,它意味着将其回滚,但回滚会影响所有事务,而不仅影响最内层的事务,因此该过程会影响执行流程。
找到位置的方法取决于可用的工具/技能。更好的方法是使用SQL Profiler来显示应用程序对服务器执行的所有命令。找出最外面的存储过程,并通过其代码查找任何其他过程调用。
系统功能@@TRANCOUNT
将返回当前有多少笔交易。作为调查的一部分,请在适当的地方插入PRINT @@TRANCOUNT
或SELECT @@TRANCOUNT
陈述以查看发生了什么问题。
这通常意味着你有嵌套事务并且有一个ROLLBACK。你并没有真正提供关于代码运行,存储过程,动态SQL等的任何信息。所以这只是一个猜测,但是我会搜索“ROLLBACK”,并在每个之后添加PRINT或INSERT到你的ErrorLogTable中,make确定内容是足够独特的,以确定ROLLBACK被击中。您可以尝试的另一件事是添加一些TRY - CATCH块,将PRINT或INTO YourErrorLogTable包含在CATCH中。如果您提供了有关所调用代码的更多细节(嵌套过程,您是否使用try-catch块,动态sql,linq等),我可以给您更具体的建议,以了解如何找到问题。
检查在COMMIT TRAN
或ROLLBACK TRAN
之前是否有返回命令。这是通常的错误,因为返回命令结束程序并且没有机会对其进行处理。
如果使用了命名事务,则可以使用仅返回指定事务的'ROLLBACK {事务名称}'。 – AakashM 2010-02-15 12:19:17
不,你不能。 '{transaction name}'只能是最外层事务的名称。尽管你可以创建一个保存点,但这是另一回事。 – GSerg 2010-02-15 13:12:16
哦,我的错误,误读了文档。 – AakashM 2010-02-15 14:15:33