簡體   English   中英

SQL Server,C#:事務回滾的超時異常

[英]SQL Server, C#: Timeout exception on Transaction Rollback

我有一個奇怪的問題。 我有一個.NET程序,我的進程邏輯需要一個SQL Server 2005數據庫上長時間運行的事務(~20分鍾)。 沒關系,因為沒有人並行訪問數據庫。 當出現問題時,應該回滾事務。

很少,沒有任何可見的圖案Rollback()我在操作DbTransaction對象將拋出SqlException

Message: "Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding."

StackTrace:
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
   at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParserStateObject.ReadPacket(Int32 bytesExpected)
   at System.Data.SqlClient.TdsParserStateObject.ReadBuffer()
   at System.Data.SqlClient.TdsParserStateObject.ReadByte()
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, Boolean isDelegateControlRequest)
   at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest, String transactionName, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
   at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction(TransactionRequest transactionRequest, String name, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
   at System.Data.SqlClient.SqlInternalTransaction.Rollback()
   at System.Data.SqlClient.SqlTransaction.Rollback()

我不知道它是否真的是一個超時問題,因為這個代碼有時會運行,有時也不會運行。 此外,我知道的唯一超時是ConnectionTimeoutCommandTimeout ,但顯然在這種情況下這些不是問題。

有沒有人對這個問題有所了解?

非常感謝,馬蒂亞斯

Sql Server團隊的Matt Neerincx在一個MSDN論壇問題中解決了這個問題 奇數但是為真,連接字符串的連接超時用於設置超時。 他通過查看源代碼驗證。

交易可能需要一段時間才能回滾; 如果這需要太長時間,請確保你會超時。 似乎沒有一種明顯的方法來影響這一點 - 你可以嘗試通過TSQL管理事務 - 然后你可以(ab)使用CommandTimeout - 但它可能只是需要一點時間,如果你正在做很多交易內部的變化; SQL Server 假設大多數事情都將運行完成,因此“提交”幾乎是免費的,而“回滾”則更昂貴。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM