AICon 上海站|日程100%上线,解锁Al未来! 了解详情
写点什么

在使用 LINQ to SQL 和 LINQ to Entities 时实现 NOLOCK

  • 2008-03-25
  • 本文字数:1510 字

    阅读完需:约 5 分钟

Scott Hanselman 最近发表了一篇非常有用的文章,谈到了如何在使用 LINQ to SQL 和 LINQ to Entities 时利用 NOLOCK 选项。这个问题实际是在找出一个办法,使 LINQ 查询生成的 SQL 语句能够像 SQL 开发人员常用的做法那样加上 NOLOCK 选项。

既然 LINQ to SQL 会动态生成 SQL 查询,因此向开发人员提供控制查询语句的能力还是有一定必要的。Scott 指出,并非所有的情况都应该使用 NOLOCK 选项,它只是最后一个可以依靠的手段:

然而,使用 NOLOCK(即使“每个人”多多少少都用过这个方法)通常是最后一个可以依靠的手段。使用了 NOLOCK 的查询并不保证能返回正确地结果,而且从技术上讲,它可能会返回任意结果。

SQL 2005 有一个基于快照的隔离级别 ,它能在不允许“脏读”的情况下避免数据读取阻塞数据写入,或者数据写入阻塞数据读取。对于我个人来说,目前的 NOLOCK 在旧有的具有一定规模的系统中,工作得很好,但是我也听闻有人认为应该避免使用 NOLOCK。对于这一点,完全就要看此人是如何定义“正确结果”这个概念了。;)

对于在查询中添加 NOLOCK 选项,Scott 提出了三种方法:

推荐的做法是使用 TransactionScope 来控制 LINQ to SQL 和 LINQ to Entities 执行命令时的事务选项(译者注:如果在一个 TransactionScope 的作用范围内开启多个数据库连接就会引发基于 MSDTC 的分 布式事务,从而降低性能,在使用这种做法时要注意这一点): > LINQ to SQL 同样支持显式设置上下文的事务,所以您可以获取上下文的数据库连接,然后打开它,开启一个事务,并在上下文中设置。如果您觉得 SQL 2005 提升事务级别过于频繁,不妨试试这个做法。不过,最佳选择则是使用 TransactionScope。

ProductsNewViewData viewData = new ProductsNewViewData();<br></br>using (var t = new TransactionScope(TransactionScopeOption.Required,<br></br> new TransactionOptions { <br></br> IsolationLevel = <strong>System.Transactions.IsolationLevel.ReadUncommitted</strong><br></br> }))<br></br>{<br></br> viewData.Suppliers = northwind.Suppliers.ToList();<br></br> viewData.Categories = northwind.Categories.ToList();<br></br>}

第二种做法已经被证明是卓有成效的,那就是使用存储过程:

至于第二种做法,您依旧可以创建带有 NOLOCK 的存储过程,并且使用 LINQ to SQL 来访问它们。不过对于 LINQ to SQL 和 LINQ to Entities 动态生成的 SQL 语句来说,较好的选择依旧是使用 TransactionScope 来避免查询对于它所读取的表的锁定。

第三种方法是在 DataContext 级别中进行设置:

至于第三种做法,您可以在 DataContext 级别进行设置(很明显,这会影响每个生成的执行在上下文之上的 LINQ to SQL 查询语句),使它执行如下命令:

SET TRANSACTION ISOLATION LEVEL <strong><a href="http://msdn2.microsoft.com/en-us/library/aa259216%28SQL.80%29.aspx">READ UNCOMMITTED</a></strong>

对于 Scott 提出的每种方法,赞成者有之,同时也不乏反对者。也有一些争论是关于 NOLOCK 选项本身,以及是否应该在部署时使用 NOLOCK 选 项。例如,如果按照第一种方式来使用 NOLOCK 选项,那么当 NOLOCK 不再需要时,就需要重新进行部署。而如果 NOLOCK 是在存储过程中使用的,那 么只需要在数据库级别进行修改即可。

显然,NOLOCK 只是如今 SQL 中许多选项中的一种。而对于上面提到的技术,也没有证据说明不能用同样的方法使用其它 SQL 选项。 若要了解更多有关 LINQ to SQL 和 LINQ to Entities 的信息,敬请访问 MSDN 网站。您也可以在 Computerzen.com 中访问到 Scott Hanselman 著名的博客。

查看英文原文: Implementing NOLOCK with LINQ to SQL and LINQ to Entities

2008-03-25 08:582914
用户头像

发布了 157 篇内容, 共 57.7 次阅读, 收获喜欢 6 次。

关注

评论

发布
暂无评论
发现更多内容

架构师训练营第三周课后作业

竹森先生

极客大学架构师训练营

中心化是人性,去中心化是技术

CECBC

区块链技术 去中心化 超级节点

元年云“宽能力”拓宽成长型企业数字化升级之路

人称T客

从单机事务到分布式事务

ElvinYang

架构师训练营Week03

Frank Zeng

【架构师训练营 - 作业 -3】组合模式

小动物

极客大学架构师训练营 作业 第三周

单例和组合模式

陈皮

当教育遇上区块链,会擦出什么样的火花?

CECBC

区块链技术 去中心化 防篡改 教育资源共享

week3 作业& 手撕单例模式

不在调上

【week03】总结

chengjing

第三周作业

戴维斯

极客大学架构师训练营

奈学教育《百万架构师》课程大纲

奈学教育

极客大学架构师训练营

Tweak原理与越狱防护

冯选刚

大白话Java多线程,小白都能看的懂的哦

root

Java 多线程 线程安全 创建线程方式 什么是多线程

万恶的NPE差点让我半个月工资没了

root

Java 程序员 互联网 NPE 空指针

week3

Geek_2e7dd7

week 3学习总结

Geek_2e7dd7

瓷都景德镇牵手蚂蚁区块链,重塑非遗陶瓷产业

CECBC

区块链技术 溯源 防篡改 景德镇 非遗

【架构师训练营 - 周总结 -3】设计模式、重构

小动物

总结 极客大学架构师训练营 第三周

第三周作业

andy

第三周总结

andy

架构师训练营第 3 周 _ 学习总结

方舟勇士

课程总结

奈学教育《百万架构师》课程大纲

古月木易

极客大学架构师训练营

有益思考一则:概率与格局

石君

思考 思维方式 格局

架构师训练营week3学习总结

Frank Zeng

Week 03- 作业一:设计模式

dean

极客大学架构师训练营

代码重构--架构师必备技能

极客李

【week03】作业1

chengjing

week3 学习总结

不在调上

极客大学架构师训练营

用于可视化软件体系结构的C4模型(转载)

清风徐徐

代码重构练习三

极客李

在使用LINQ to SQL和LINQ to Entities时实现NOLOCK_.NET_Robert Bazinet_InfoQ精选文章