【问题标题】:linq query lock issue (linq to sql)linq 查询锁定问题(linq to sql)
【发布时间】:2011-04-03 06:41:56
【问题描述】:

我得到一个 linq 查询超时异常。在网上搜索了一下后,使用 TransactionScope 使其“nolock”得到了我的投票。但是,使用下面的代码后,我仍然得到相同的超时异常。如有任何帮助,请提前致谢。

IEnumerable<IGrouping<string, Log>> grps = logs.GroupBy(l => l.msg_shortdesc);
using (var t = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }))
{
  var lst = grps.ToList();
}

【问题讨论】:

    标签: c# linq time out


    【解决方案1】:

    您已经有了正确的策略和带有TransactionOptionsIsolationLevel.ReadUncommitted 的语句来帮助您在SQL 语句中使用NOLOCKHanselman suggests it

    问题在于 LINQ To SQL 生成的 SQL 语句是否在数据库上执行。请记住,Dev、Test 和 Prod 的表现会有所不同,具体取决于表中的行数以及查询中的数据类型。

    需要检查的一些事项:

    • 发送到服务器的 SQL 语句是什么?使用 SQL Profiler 检查。该 SQL 是否通过 SSMS 在即席查询中及时运行?

    • msg_shortdesc 列上是否有索引?为该列在该表上添加一个新索引(如果不存在)。重新运行 LINQ To SQL 查询以检查其性能。

    听起来您没有更改数据库配置(索引)的选项。建议如果没有进行配置更改的能力,您将无法进行“正确”的调整来提高性能。不幸的是,您会不断受到其他用户产生的随机负载的影响。

    如果您绝对无法创建索引,请考虑对这组数据使用缓存策略。或许将这些数据加载到Session 并每隔 n 分钟过期一次。

    【讨论】:

    • 您好坎贝尔,感谢您的快速回复。我认为 msg_shortdesc 没有索引
    • 它应该返回 1000+ 条记录。我知道并发查询存在阻塞问题,这就是我使用 TransactionScope 的原因。 msg_shortdesc 是 varchar
    • @campbell:我无权向该数据库添加新索引,但是,有时我可以很快得到结果。我相信这仍然是'nolock'问题,只要我查询的表没有被任何人锁定,我就可以获得结果。我的问题是,TransactionScope 是为此目的而设计的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多