代码之家  ›  专栏  ›  技术社区  ›  Sam Schutte

LINQ to SQL是否在查询期间锁定SQL Server?

  •  0
  • Sam Schutte  · 技术社区  · 15 年前

    有个奇怪的问题。我正在测试我编写的通过Ajax查询SQL Server的ASP.NET应用程序。应用程序正在使用LINQ to SQL从一个联接中的大约8个表中加载数据,并且每隔一段时间,对SQL Server的调用就会被锁定并且永远不会返回。

    我的第一个想法是它会死锁,但是根据我读到的内容,如果发生这种情况,SQL Server应该选择杀死其中一个有问题的线程。对于这个应用程序,也没有其他用户访问数据库,所以我不知道这是怎么回事。

    其他症状:

    1. 执行此调用时,服务器上的处理器使用率将达到40%左右,并且即使在应用程序关闭后(在Visual Studio中为“已停止”)也会保持在该状态。

    2. 服务器继续执行调用,直到我实际执行并杀死托盘中的Visual Studio Web服务器(Cassini)。

    3. 当查看SQL Server正在做什么时,我们只看到它正在执行LINQ to SQL调用,没有什么异常。

    有人对这种“气味”有什么想法吗?

    谢谢, 山姆

    2 回复  |  直到 14 年前
        1
  •  1
  •   ChrisLively    15 年前

    首先,将您的SQL Server更新到最新的Service Pack级别。您可能希望查看自该Service Pack以来已发布的累积更新,并查看是否有任何问题听起来像您的特定问题。可能已经解决了。

    SQL Server将选择取消死锁中的一个项,但这还取决于查询超时设置是什么。如果超时足够高(300秒…),SQL Server可以继续执行调用一段时间。

    如果可能的话,您可以在SQL调用中对表使用nolock,使其成为非阻塞选择。对于Linq to SQL,将事务隔离级别设置为“未提交读取”,它与NoLock相同。

    我将进一步跟踪linq-to-sql调用,并在SQL事件探查器中重新运行它们,以查看是否有更好的调优方法,比如更好的索引等。

        2
  •  0
  •   user281806    14 年前

    我在Linq中看到过类似的行为,如果事务开始,但从未完成。

    推荐文章