我有一个进程,其中两个线程在同一个表上连续执行 sql 查询。这两个线程之一是否有可能出现超时错误?如果是这样,避免这种情况的最佳做法是什么?
我收到以下错误,结果是进程崩溃。
超时已过。在操作完成之前超时时间已过或服务器没有响应。
您可能会收到超时的原因有很多。如果您遇到连接异常,那么 SqlConnection 中的超时是多少?如果不是,那么 SqlCommand 中的命令超时是多少?
您的查询结构是否正确?您希望查询返回多少行?两张表有多少行?
听起来你的桌子上有一把锁。研究锁定机制。如果你锁定整个表,它是低效的,相反,你可以锁定一个表的子集,即 - 行。
同样在您的连接字符串中,您可以减少超时。将其更改为 2 秒(建立连接的时间,而不是查询数据)。如果您确实收到该错误,那么您可以从那里开始工作。
如果您的查询只是读取,而不是更新或插入,则可以使用 NOLOCKS。
使用 NOLOCK 从 MyTable 中选择 *
这应该停止任何锁定。
听起来像表锁定...您应该使用带有 ReadUncommited 选项的事务范围,例如:
var islolation=new TransactionOptions();
isolation=IsolationLevel.ReadUncommitted;
using(var scope=new TransactionScope(TransactionScopeOption.requiresnew,isolation))
{
//code here
scope.complete();
}
此外,最好检查一下您是否在查询执行后立即关闭连接。