写点什么

在使用 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:582708
用户头像

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

关注

评论

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

05 | 数组:为什么很多编程语言中数组都从0开始编号

鲁米

服务器集群技术有哪几种类型

Geek_f19a80

服务器

深入理解HarmonyOS UIAbility:生命周期、WindowStage与启动模式探析

华为云开发者联盟

鸿蒙 操作系统 华为云 HarmonyOS 华为云开发者联盟

京东面试:说说Cookie、Session和Token的区别?

王磊

Java 面试

纯CSS实现炫酷背景霓虹灯文字效果

南城FE

CSS 前端 动画 交互设计

细说GaussDB(DWS)的2种查询优化技术

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 华为云GaussDB(DWS)

拼版不合理案例详解

华秋电子

对标世界一流!用友已与74家中央企业达成集团级合作!

用友BIP

HarmonyOS振动效果开发指导

HarmonyOS开发者

HarmonyOS

如何从 Jira 成功迁移到极狐GitLab,看这个就够了!

极狐GitLab

项目管理 DevOps gitlab 敏捷开发

06 | 链表(上):如何实现LRU缓存淘汰算法

鲁米

重磅签约!美团携手用友推进数智化升级

用友BIP

企业数智化

iOS代码混淆工具

雪奈椰子

DDD学习与感悟——总是觉得自己在CRUD怎么办? | 京东云技术团队

京东科技开发者

架构 DDD 软件设计 curd

Tomcat 配合虚拟线程,一种新的编程体验

越长大越悲伤

Java springboot 虚拟线程

JVM C1、C2编译器

FunTester

07 | 链表(下):如何轻松写出正确的链表代码?

鲁米

Amazon CodeWhisperer 正式发布可免费供个人使用

亚马逊云科技 (Amazon Web Services)

人工智能 Amazon Lambda 云上探索实验室 Amazon CodeWhisperer Amazon Cloud9

一次讲清楚京东科技百亿级用户画像平台的探索和实践 | 京东云技术团队

京东科技开发者

数据库 Clickhouse 用户画像 用户画像平台

三层开发

Geek_8da502

APP开发

用友与厦国会联合培训,探索智能会计时代业财融合成功模式

用友BIP

智能会计

走进厦航,体验智能会计时代的业财融合

用友BIP

智能会计 业财融合

2024深圳电子展,加快粤港澳电子信息发展,重点打造湾区经济

AIOTE智博会

电子展 深圳电子展 电子信息展 电博会

08 | 栈:如何实现浏览器的前进和后退功能

鲁米

CnosDB 科技春晚暨CnosDB 2.4.0 Milky Way发布会

CnosDB

开源 时序数据库 CnosDB CnosDB2.4.0发布会

GPU深度学习性能的三驾马车:Tensor Core、内存带宽与内存层次结构

Baihai IDP

人工智能 程序员 AI gpu LLM

【FAQ】运动健康服务端侧数据常见问题及解答

HarmonyOS SDK

HMS Core

一键自动修改和翻新OC源码,解决苹果审核4.3和马甲问题

【高效视频处理】体验火山引擎多媒体处理框架 BMF

数字扫地僧

BMF

喜讯!华秋荣获2023中国产业数字化百强榜企业

华秋电子

关于Nuxt.js 服务端组件的使用

秃头小帅oi

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