写点什么

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

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

关注

评论

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

MySQL 多版本并发控制

不在线第一只蜗牛

MySQL

2025 DePIN报告

PowerVerse

一颗荔枝50万,如何做成一个大项目?

禅道项目管理

项目管理 敏捷开发 需求管理 禅道项目管理软件 WBS

MyEMS:开启能源管理新时代​

开源能源管理系统

MyEMS 在行业中的应用与优势剖析

开源能源管理系统

开源 能源管理

Airweave - 让AI代理搜索任何应用的统一知识平台

qife122

AI代理 搜索技术

小程序热更新:驱动App无感迭代的“空中引擎”技术范式

xuyinyin

TypeScript结构化类型初探

电子尖叫食人鱼

typescript

实例解析:粮油食品仓储RFID高效管理方案

斯科信息

仓储RFID解决方案

等保测评在哈尔滨:筑牢网络安全基石的实践探索

等保测评

洪定坤:我与 TRAE 合作的第一个开源项目,欢迎下载

火山引擎开发者社区

字节跳动

电脑卡顿反应慢的原因及解决方法

阿拉灯神丁

电脑选购 CleanMyMac 电脑运行缓慢 Mac电脑使用教程 mac电脑维护工具

引迈信息6周年:数智领航,共赴新程

引迈信息

4S店看过来:斯科提出基于RFID技术的维修工器具智能化管理解决方案

斯科信息

RFID解决方案 RFID工具库房

Pickle 开源 AI 桌面助手 Glass:捕捉屏幕生成结构化信息;邱锡鹏团队开源对话语音模型 MOSS-TTSD丨日报

声网

Agentic Data时代:让数据主动思考,驱动业务增长

火山引擎开发者社区

火山引擎

黑龙江等保测评注意事项

等保测评

AI 英语口语 App 的核心功能

北京木奇移动技术有限公司

软件外包公司 AI英语学习 AI英语口语

Disk Graph|扇形图+矩形图双模式,清理磁盘空间超直观

柠檬与橘子

自然语言转SQL再突破!腾讯云TCDataAgent斩获国际榜单全球第三、国内第一

极客天地

容器技术与AI双向赋能:应用开发范式的效能跃迁与架构重构

xuyinyin

轻松上手|TRAE + DeepSeek 打造 AI 排版智能体

火山引擎开发者社区

Trae

智源研究院26届“智星”科技人才计划正式启动

智源研究院

借助HarmonyOS SDK,《NBA巅峰对决》实现“分钟级启动”到“秒级进场”

HarmonyOS SDK

HarmonyOS HarmonyOS NEXT HarmonyOS SDK应用服务

CAD图纸定位双神器:测坐标防偏移,测立面拒返工!

在路上

cad

CAD编号如何自动递增?两种神技,效率拉满!

在路上

cad cad看图 CAD看图王

懒懒笔记 | 课代表带你梳理【RAG课程 19:基于知识图谱的RAG】

商汤万象开发者

AI agent LLM rag

医用布草管理RFID解决方案

斯科信息

RFID解决方案 医院布草管理 斯科信息

从被动救火到主动预测!碧桂园服务以图谱技术重塑IT运维底座

智在碧得

快递行业实现RFID技术自动化分拣解决方案

斯科信息

RFID 快递RFID自动化分拣 RFID分拣

火山引擎Data Agent全面上线!以企业级数据智能体,重构数据应用范式

火山引擎开发者社区

火山引擎

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