提问人:Nikita Kalimov 提问时间:7/19/2022 更新时间:7/19/2022 访问量:7181
System.Data.SqlClient.SqlException (0x80131904): 超时已过期。三种不同的案例
System.Data.SqlClient.SqlException (0x80131904): Timeout expired. Three different cases
问:
我已经开始遇到超时错误,但不确定如何处理它们,因为它们每次都不同。
第一种超时类型
System.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
---> System.ComponentModel.Win32Exception (258): Unknown error 258
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
at System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()
at System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()
at System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer()
at System.Data.SqlClient.TdsParserStateObject.TryReadByte(Byte& value)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
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.SqlInternalConnection.BeginSqlTransaction(IsolationLevel iso, String transactionName, Boolean shouldReconnect)
at System.Data.SqlClient.SqlConnection.BeginTransaction(IsolationLevel iso, String transactionName)
at System.Data.SqlClient.SqlConnection.BeginDbTransaction(IsolationLevel isolationLevel)
at System.Data.Common.DbConnection.BeginDbTransactionAsync(IsolationLevel isolationLevel, CancellationToken cancellationToken)
第二种超时
System.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
---> System.ComponentModel.Win32Exception (258): Unknown error 258
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.SqlCommand.EndExecuteNonQueryInternal(IAsyncResult asyncResult)
at System.Data.SqlClient.SqlCommand.EndExecuteNonQuery(IAsyncResult asyncResult)
at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
第三种超时
System.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
---> System.ComponentModel.Win32Exception (258): Unknown error 258
at System.Data.SqlClient.SqlCommand.<>c.<ExecuteDbDataReaderAsync>b__126_0(Task`1 result)
at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location where exception was thrown ---
at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
--- End of stack trace from previous location where exception was thrown ---
at Dapper.SqlMapper.QueryAsync[T](IDbConnection cnn, Type effectiveType, CommandDefinition command) in C:\projects\dapper\Dapper\SqlMapper.Async.cs:line 419
如何诊断这些问题?去哪里看?为什么在三个不同的操作上会发生相同的超时错误?在客户端,设置是我最后的手段吗?CommandTimeout
另外,一个重要的细节:我碰巧遇到了这个超时错误,即使在TEST环境中没有负载。
.NET 6,MARS=false,Windows,超时=30。仅具有默认值。不幸的是,我没有设法捕捉到确切的堆栈跟踪。CommandTimeout
附言。
查看搜索结果,似乎没有解决我的问题的方法。在一种情况下,可能会有所帮助 [尝试过 - 帮助消除连接超时]。在另一个 - [好吧,我可能会尝试一下,但是在我使用数据库的任何地方输入它?它还可以帮助解决 BeginTransaction 超时吗?某处甚至存在 -setting,但即使禁用,问题也会重现。Linux 或 Windows - 也没关系,因为在 Windows 上也会遇到问题。我们认为迁移到 .NET 6 可能会有所帮助,但也没有帮助。Timeout
CommandTimeout
MARS
MARS
答:
指向 MSDN 的链接,有人遇到同样的问题。我相信相关信息是这样的:
当无法访问实例时,该消息本身是标准消息。但是,错误 258 在这种情况下是不寻常的。这不是 SQL Server 错误,而是操作系统错误;NET HELPMSG 258 说等待操作超时。
这可能表明您正在到达某个地方,但实际上没有人在听。也就是说,端口是开放的,但进程正忙于其他事情。(这不一定不是 SQL Server 进程。
那么,您的 SQL Server 运行情况如何?跟不上工作量?间歇性崩溃?防病毒和/或网络保护软件?
疑难解答提示
谷歌sp_Blitz和兄弟姐妹。它们是免费脚本,可帮助您查找 SQL Server 上的问题。另外sp_whoIsActive - 它非常擅长显示阻塞问题。
要找到线程池饥饿,你最好的选择可能是等待统计数据。
检查 sql server 中的 DMV。选择它(并保存),稍等片刻,然后再次选择 - 等待统计数据是累积的,所以不会给你任何有用的东西。顺便说一句,sp_Blitz将帮助您做到这一点。sys.dm_os_wait_stats
select * from sys.dm_os_wait_stats
如果启用了查询存储,则可以轻松找到资源消耗最多的查询,还可以找到一些有用的等待统计信息细分 - 但不确定 Threadpool 在哪里等待。
评论
BeginTransaction()