2012-02-18 113 views
1

我有一个很大的SQL Server 2008 R2数据库,有很多行不断更新。更新由调用存储过程的后端服务应用程序完成。在其中一个存储过程中,有一个SQL游标可以重新计算和更新数据。这一切运行良好。超出锁定请求超时时间 - Telerik OpenAccess ORM

但是,我们的前端Web应用程序需要通过这些行搜索和该搜索有时会导致

锁请求超时周期超出。在 Telerik.OpenAccess.RT.Adonet2Generic.Impl.PreparedStatementImp.executeQuery()..

之后做一些研究,我发现,最好的办法,使查询运行没有问题是使其与运行“读取未提交的隔离级别”。我发现这个设置可以在Telerik OpenAccess设置中进行,但这是一个影响整个数据库ORM项目的设置。这不是我想要的!我只需要这个查询的这个级别。

有没有办法让这个特定的LINQ查询运行在这个未提交的隔离级别? 或者我们可以让这个查询使用WITH NOLOCK提示吗?

+0

如果有一种方法可以帮助我们防止这些锁定错误,那么也会很有趣。最重要的是我们的前端可以执行快速搜索。速度也比数据一致性更重要。 – Tys 2012-02-18 16:04:22

+2

如果你能够直接编辑查询,你可以使用下面的语句来设置当前会话的隔离:'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED' – 2012-02-18 16:09:05

+1

我敢打赌,取代你的游标解决方案将会减少基于集合的解决方案你的锁定问题,并可能表现更好。 – 2012-02-18 16:10:47

回答

2

使用

SET LOCK_TIMEOUT -1 

在查询的开始。

reference manual

Runnung在read uncommitted隔离级别的查询(和使用NOLOCK提示)会导致很多奇怪的问题,你必须要了解清楚你为什么这样做,如何将其与你的数据流干扰

+0

我知道所有关于可能发生的'奇怪问题',所以为什么我明确表示我在监督并愿意承担这些'风险'。如果你知道风险是什么,那么他们不再那么大:) – Tys 2012-02-20 17:34:09