2010-02-15 89 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之前是否有返回命令。這是通常的錯誤,因爲返回命令結束程序並且沒有機會對其進行處理。

相關問題