QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

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

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

关注

评论

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

轻至986g,续航18小时、120TOPS算力!ThinkPad X1 Carbon Aura AI元启版刷新商务AI PC巅峰体验

科技范儿

剖析——陪玩源码,陪玩平台搭建的各种必备功能与收益来源,游戏陪玩系统源码

DUOKE七七

php 开源 uniapp 陪玩系统源码

华为云Flexus X实例使用教学——完整的配置选择与实操步骤讲解

轶天下事

手把手教你如何用华为云Flexus X实例部署之前爆火的“人生重启“游戏

轶天下事

Flexus云服务器X,云上性能新飞跃,开启业务增长新纪元

轶天下事

部署有声读物和播客的自托管媒体服务器Audiobookshelf

轶天下事

向量检索的3种方式

DashVector

人工智能 数据库 向量检索 大模型

如何找到可靠的海外云服务器租用商

Ogcloud

云服务器 香港云服务器 美国云服务器 海外云服务器 云服务器租用

Redis-十大数据类型

不在线第一只蜗牛

数据库 redis 缓存

基于华为云Flexus云服务器X实例部搭建Halo博客平台

轶天下事

聚力创新|首届BIOV生命科技与再生医疗国际峰会在泰国曼谷圆满举行

TechubNews

探索Flink动态CEP:杭州银行的实战案例

Apache Flink

大数据 flink 数据分析 CEP 实时处理

大语言模型的上下文窗口 (Context Windows)

澳鹏Appen

文本生成 LLM 大语言模型

ByConity BSP 解锁数据仓库新未来

Swift社区

基于Flexus X加速MySQL镜像搭建XXL-JOB任务调度平台

轶天下事

性能优化!突破性能瓶颈的尖兵CPU Cache

不在线第一只蜗牛

性能优化

华为云Flexus云服务器X实例之openEuler系统下部署GitLab服务器

轶天下事

指标管理+AI大模型深度融合,开启智能数据分析管理新时代

袋鼠云数栈

出海电商如何解决网络问题

Ogcloud

SD-WAN 跨境电商网络 外贸网络 SD-WAN国际专线 国际网络专线

Gate.io 平台通证 GT:持续赋能与销毁、财富效应显著

股市老人

Altair RapidMiner 解锁更高级别的功能,支持用户无缝构建和部署高级 AI agent

Altair RapidMiner

机器学习 #人工智能 altair #数据分析 RapidMiner

优化大宽表查询性能,揭秘GaussDB(DWS) 谓词列analyze

华为云开发者联盟

GaussDB #数据库 analyze

全新红娘交友系统定制版源码| 相亲交友小程序源码全开源可二开_

DUOKE七七

php 开源 uniapp

YOLOv5 的量化流程及部署方法

地平线开发者

自动驾驶 算法 地平线征程5 地平线征程6

华为ensp--BGP路由黑洞

阿落ovo

Flexus云服务器X实例赋能,用Python将微信公众号秒变智能聊天机器人

轶天下事

向量更新的3种方式

DashVector

人工智能 数据库 大模型

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