SqlException:超时已过期
Posted
技术标签:
【中文标题】SqlException:超时已过期【英文标题】:SqlException: Timeout Expired 【发布时间】:2010-10-27 07:52:36 【问题描述】:我有一个进程,其中两个线程在同一个表上连续执行 sql 查询。这两个线程之一是否有可能出现超时错误?如果是这样,避免这种情况的最佳做法是什么?
我收到以下错误,导致进程崩溃。
超时。在操作完成之前超时时间已过或服务器没有响应。
【问题讨论】:
【参考方案1】:您可能会收到超时的原因有很多。如果您遇到连接异常,那么 SqlConnection 中的超时是多少?如果不是,那么 SqlCommand 中的命令超时是多少?
您的查询结构是否正确?您希望查询返回多少行?两张表有多少行?
【讨论】:
我预计只返回一行,但表中有大约 100,000 行。 @Faisal,如果是这种情况,那么很可能您的桌子上有锁。在查询阻塞时运行 sp_lock 并查找具有排他 (X) 锁的对象。【参考方案2】:听起来你的桌子上有一把锁。研究锁定机制。如果锁定整个表,效率低下,相反,您可以锁定表的子集,即 - 行。
同样在您的连接字符串中,您可以减少超时。将其更改为 2 秒(建立连接的时间,而不是查询数据)。如果您确实收到该错误,那么您可以从那里开始工作。
【讨论】:
这些是只读操作。这将有助于采取行级锁定吗?我已经在使用 NOLOCK。 是整个表都用于读取数据,还是同时更新? 另外,如果您在白天读取数据,晚上通过某种自动化过程写入数据,您是否需要锁定?只要读写是分开的并且不能同时发生,那么锁定就不是问题。您可以与数据库建立的连接数是否有限制? @vikp,读写可以同时发生。我可以在我的代码中看到一些尝试更新同一个表的 sql 调用。所以,是的,我有一个线程正在读取和写入 sql 表,而另一个线程只是读取。 @vkip,我应该在更新语句中使用行锁吗?有没有什么影响。我的 Update 语句将始终更新一行。【参考方案3】:如果您的查询只是读取,而不是更新或插入,则可以使用 NOLOCKS。
使用 NOLOCK 从 MyTable 中选择 *
这应该会停止任何锁定。
【讨论】:
【参考方案4】:听起来像表格锁定... 您应该使用带有 ReadUncommited 选项的事务范围,例如:
var islolation=new TransactionOptions();
isolation=IsolationLevel.ReadUncommitted;
using(var scope=new TransactionScope(TransactionScopeOption.requiresnew,isolation))
//code here
scope.complete();
在查询执行后检查您是否正在关闭连接也很好。
【讨论】:
以上是关于SqlException:超时已过期的主要内容,如果未能解决你的问题,请参考以下文章
ASP.Net MVC 3 System.Data.SqlClient.SqlException 超时已过期