考慮一個存儲過程,它可以在不使用事務的情況下在60秒內更新一些行。我們將ADO.NET的SqlCommand.Timeout設置爲30秒。ADO.NET的SqlCommand.CommandTimeout如何工作?
SqlCommand.Timeout = 30;
當超時發生在30秒時,存儲過程是否會繼續在數據庫服務器中運行?服務器如何與客戶端進行通信?
考慮一個存儲過程,它可以在不使用事務的情況下在60秒內更新一些行。我們將ADO.NET的SqlCommand.Timeout設置爲30秒。ADO.NET的SqlCommand.CommandTimeout如何工作?
SqlCommand.Timeout = 30;
當超時發生在30秒時,存儲過程是否會繼續在數據庫服務器中運行?服務器如何與客戶端進行通信?
如果你還沒有關閉你的SQL連接,它應該繼續運行,如果它已經開始執行。 (你應該可以測試&對此比較容易驗證。)
答案是否定的,你在服務器上的嘗試操作將在30秒後失敗,你的SqlCommand對象會在你的代碼中拋出一個異常(下面)存儲過程事務將回滾。
超時已過期。操作完成之前超時的時間或服務器沒有響應。
...至少這是我可以驗證使用SQL Server我想知道完全相同的行爲......
。我找不到答案,但做了一些試驗,看起來好像發送了某種取消查詢:
我知道這是一個五歲的崗位,但如果我來到這裏,其他人也:-)
順便說一句,在ado.net,以增加你的超時時間,你必須在sqlcommand和sqlconnection中增加,第一個的默認值是15秒,第二個30秒。所以如果你只是將sqlcommand改爲60秒,它將在30秒後仍然超時,這可能會令人費解。
這裏特殊的是「隱式交易」。所有sql命令(至少每一個都是IMPLICIT事務的AUTOAMTICALLY部分),即使沒有顯式設置事務。 – TomTom 2010-08-01 21:58:44
這個異常是一個明確的事務,除非SET XACT_ABORT ON被設置 - 直到連接本身關閉,否則這個事務根本不會回滾並保持打開/未提交狀態。在連接池中,這可能永遠不會發生(下一個命令可能會在事務的上下文中運行?不確定但是存在風險) – urbanhusky 2015-06-26 09:48:30