【发布时间】:2012-02-19 06:04:21
【问题描述】:
我有一个大型 SQL Server 2008 R2 数据库,其中包含许多不断更新的行。更新由调用存储过程的后端服务应用程序完成。在其中一个存储过程中有一个 SQL 游标,用于重新计算和更新数据。这一切都运行良好。
但是,我们的前端 Web 应用程序需要搜索这些行,而这种搜索有时会导致
已超过锁定请求超时期限。在 Telerik.OpenAccess.RT.Adonet2Generic.Impl.PreparedStatementImp.executeQuery()..
在做了一些研究之后,我发现让这个查询运行没有问题的最好方法是让它在“读取未提交的隔离级别”下运行。我发现可以在 Telerik OpenAccess 设置中进行此设置,但该设置会影响整个数据库 ORM 项目。那不是我想要的!我只想要这个查询的这个级别。
有没有办法让这个特定的 LINQ 查询在这个未提交的隔离级别上运行? 或者我们可以让这个查询使用 WITH NOLOCK 提示吗?
【问题讨论】:
-
如果有一种方法可以提示我们更新后端应用程序以帮助我们防止这些锁定错误,那也会很有趣。最重要的是我们的前端可以执行快速搜索。速度也比数据一致性更重要。
-
如果您能够直接编辑查询,您可以使用此语句为当前会话设置隔离:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED -
我敢打赌,用基于集合的解决方案替换您的光标解决方案将减少您的锁定问题,并且可能表现更好。
-
我已经做了一些测试,但是根据我们拥有的数据量,基于光标的解决方案比基于集合的解决方案执行得更快。
-
阅读一些关于必须进行大量计算/聚合并进行一些测试的存储过程。一段时间后,你的星星会自动形成一个灯泡形状;)
标签: sql sql-server linq openaccess telerik-open-access