我们的DBA向我们提供了有关我们的LINQ查询在数据库上创建了数千个锁的信息。我们团队的开发人员挖掘了这个Hanselman帖子,作为我们问题的可能解决方案:
http://www.hanselman.com/blog/GettingLINQToSQLAndLINQToEntitiesToUseNOLOCK.aspx
Scott在LINQ中提供了3种设置NOLOCK的方法。 1)TransactionScope(首选),2)SPROCS,3)context.ExecuteCommand
我们是一个新闻网站,99%读取,1%写入,因此我们主要关注检索的速度。 NOLOCK 是我们所有LINQ-TO-SQL查询的好策略吗?
我想要了解的是为什么使用NOLOCK是或不是一个好主意。必须有很多人有相同的目标:许多快速读取,很少甚至没有更新。如果NOLOCK是明显的答案,那为什么它不是默认的?为什么我不能在上下文中将其设置为默认值,而不是必须在每个数据调用中设置它?
NOLOCK真的是许多快速读取的最佳选择,很少有更新网站吗?
更新:在SQL Server 2005及更高版本中,快照隔离是否优于NOLOCK? 我刚发现了这个 http://msdn.microsoft.com/en-us/library/ms179599.aspx
涵盖 READ COMMITTED SNAPSHOT 。这可以防止写入块,但不会返回脏数据?它应该在90%的时间内用于NOLOCK吗?
更新2:困扰我的是DRY
最困扰我的部分是,为了实现无锁或快照模式,我必须在每个LINQ-to-SQL查询方法上更改它(除了在更新中使用的那些)。这闻起来像是对DRY的严重侵犯。