2010-02-15 63 views

回答

13

我不认为有任何遗漏。它可能是一个从事务内部调用的内部存储过程(TRANCOUNT = 1),启动自己的事务(TRANCOUNT = 2),然后将其回滚。那么,它意味着将其回滚,但回滚会影响所有事务,而不仅影响最内层的事务,因此该过程会影响执行流程。

找到位置的方法取决于可用的工具/技能。更好的方法是使用SQL Profiler来显示应用程序对服务器执行的所有命令。找出最外面的存储过程,并通过其代码查找任何其他过程调用。

+0

如果使用了命名事务,则可以使用仅返回指定事务的'ROLLBACK {事务名称}'。 – AakashM 2010-02-15 12:19:17

+2

不,你不能。 '{transaction name}'只能是最外层事务的名称。尽管你可以创建一个保存点,但这是另一回事。 – GSerg 2010-02-15 13:12:16

+0

哦,我的错误,误读了文档。 – AakashM 2010-02-15 14:15:33

3

系统功能@@TRANCOUNT将返回当前有多少笔交易。作为调查的一部分,请在适当的地方插入PRINT @@TRANCOUNTSELECT @@TRANCOUNT陈述以查看发生了什么问题。

1

这通常意味着你有嵌套事务并且有一个ROLLBACK。你并没有真正提供关于代码运行,存储过程,动态SQL等的任何信息。所以这只是一个猜测,但是我会搜索“ROLLBACK”,并在每个之后添加PRINT或INSERT到你的ErrorLogTable中,make确定内容是足够独特的,以确定ROLLBACK被击中。您可以尝试的另一件事是添加一些TRY - CATCH块,将PRINT或INTO YourErrorLogTable包含在CATCH中。如果您提供了有关所调用代码的更多细节(嵌套过程,您是否使用try-catch块,动态sql,linq等),我可以给您更具体的建议,以了解如何找到问题。

1

检查在COMMIT TRANROLLBACK TRAN之前是否有返回命令。这是通常的错误,因为返回命令结束程序并且没有机会对其进行处理。

相关问题