我有一个存储过程,当我从代码运行它时(因为超时设置为30),因为超时而给我一个SqlException。当我直接在Management Studio中运行该过程时,它会在1秒内执行。我也只在针对特定数据库运行时获得超时。当我使用其他数据库时,它可以快速完成而不会出现错误。以下是完整的错误消息:
System.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
这个堆栈跟踪对任何人都有意义吗?看起来我的sproc可能已经完成了,并且在尝试读取某种元数据时超时了吗?
我尝试在运行过程中查看该进程并将其暂停。 sys.dm_os_waiting_tasks将等待类型显示为IO_COMPLETION,如果有任何用途的话。我使用sp_who2'active'在数据库中看到的唯一进程是一次超时和我的活动SSMS窗口,所以我不认为这是一个阻塞问题。我验证了这个数据库与工作数据库具有相同的权限,并运行dbcc checkdb而没有任何错误。如何确定超时的原因?
答案 0 :(得分:6)
您可以将超时的会话的SET选项与非会话的会话的SET选项进行比较:
SELECT
session_id,
[ansi_defaults],
[ansi_null_dflt_on],
[ansi_nulls],
[ansi_padding],
[ansi_warnings],
[arithabort],
[concat_null_yields_null],
[deadlock_priority],
[quoted_identifier],
[transaction_isolation_level]
FROM
sys.dm_exec_sessions
WHERE
session_id IN (<spid1>, <spid2>);
当您发现一些不同的内容时,请尝试将每个设置更改为SSMS查询中的相反设置,直到您获得超时(或在发送查询之前手动设置应用代码中的选项)。现在,我没有方便的2005实例,所以没有测试过这个查询。您可能需要注释掉一个或多个列名。