Linq to sql 在LINQtoSQL中,我应该使用NOLOCK来提高性能吗?

Linq to sql 在LINQtoSQL中,我应该使用NOLOCK来提高性能吗?,linq-to-sql,nolock,Linq To Sql,Nolock,我们的DBA告诉我们,我们的LINQ查询正在数据库上创建数千个锁。我们团队中的一位开发人员找到了这篇Hanselman文章,作为我们问题的可能解决方案: Scott在LINQ中提供了3种设置NOLOCK的方法。1) TransactionScope(首选)、2)存储过程、3)context.ExecuteCommand 我们是一个99%阅读,1%写作的新闻网站,所以我们主要关注的是检索速度。对于我们所有的LINQ-TO-SQL查询,NOLOCK是一个好策略吗 我试图理解的是,为什么使用NOLO

我们的DBA告诉我们,我们的LINQ查询正在数据库上创建数千个锁。我们团队中的一位开发人员找到了这篇Hanselman文章,作为我们问题的可能解决方案:

Scott在LINQ中提供了3种设置NOLOCK的方法。1) TransactionScope(首选)、2)存储过程、3)context.ExecuteCommand

我们是一个99%阅读,1%写作的新闻网站,所以我们主要关注的是检索速度。对于我们所有的LINQ-TO-SQL查询,NOLOCK是一个好策略吗

我试图理解的是,为什么使用NOLOCK是一个好主意还是不是一个好主意。一定有很多人有着我们相同的目标:很多快速阅读,几乎没有更新。如果NOLOCK是显而易见的答案,那么为什么它不是默认答案呢?为什么我不能在上下文中设置默认值,而不是在每次数据调用中都设置它

NOLOCK真的是众多快速阅读、少量更新站点的最佳选择吗

更新:在SQL Server 2005及更高版本中,快照隔离是否优于NOLOCK? 我刚找到这个

其中包括读取提交的快照。这可以防止写块,但不会返回脏数据?在NOLOCK上90%的时间都应该使用它吗

更新2:困扰我的是干燥


最让我困扰的是,为了实现无锁或快照模式,我必须在每个LINQ-to-SQL查询方法上更改它(更新中使用的方法除外)。这闻起来像是对DRY的严重违反。

值得注意:
读取提交的快照
对它来说已经足够好了(或者至少在2年多以前是这样)。

这对它的速度是好的-这是坏的,因为你可能会得到尚未提交的数据(“脏数据”)这可能会被回滚,而不是持久化…未提交的数据如何返回的示例是什么?一个写作为事务的一部分,但是回滚了吗?是的,如果你碰巧在别人在事务中向它写入数据的中间读取表,你将得到未提交的数据,这可能是不完整的,或者其他进程可以最终决定回滚事务,因此,您的阅读得到了一些最后不在表中的数据..在右侧的“相关”窗格中,有大约24个关于NOLOCK的问题。