把握行业变革关键节点,12 月 19 日 - 20 日,AICon北京站即将重磅启幕! 了解详情
写点什么

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

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

关注

评论

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

生产环境10分钟黄金时间快速排障:CPU不定时飙高怎么排查?

KINDLING

Java Linux 后端 监控 ebpf

如何使用 Java8 改造模板方法模式!

风铃架构日知录

Java 程序员 后端 设计模式 模板方法

认识区块链,认知区块链——NFT

MavenTalker

区块链 NFT web3 数字藏品

启科QuTrunk+Runtime+QuSaaS+AWS量子计算编程实战

启科量子开发者官方号

量子计算

云原生应用你应该这么管- 谐云发布基于KubeVela增强的应用版本管理和在线升级

谐云

云计算 Kubernetes OAM 容器云 企业号 2 月 PK 榜

5K字 由浅入深聊聊Promise实现原理

梁木由

JavaScript 前端 前端开发 前端面试

Verilog HDL数据流建模与运算符

timerring

FPGA

微信小程序实训|基于云数据库的语文听写工具

TiAmo

微信小程序 云开发 微信开发

火山引擎DataTester:“在字节,A/B实验是一种信仰”

字节跳动数据平台

大数据 字节跳动 AB testing实战

为什么 Go 不支持 []T 转换为 []interface

AlwaysBeta

Go golang 源码 slice interface

vivo 超大规模消息中间件实践之路

vivo互联网技术

kafka 中间件 pulsar 消息中间件 RoketMQ

智慧公安!3DCAT实时云渲染助力某公安机关打造数字孪生可视化系统

3DCAT实时渲染

智慧城市 数字孪生 云渲染 实时云渲染

关于 JavaScript 定时器

devpoint

JavaScript 定时器 setTimeout setInterval

3DCAT实时云渲染助力VR虚拟现实迈向成熟

3DCAT实时渲染

vr 云渲染 虚拟现实 元宇宙

Python 内置界面开发框架 Tkinter入门篇 乙

eng八戒

Python GUI tkinter

高频JavaScript手写面试题

梁木由

JavaScript 前端 前端面试题

Trie树简介及应用

京东科技开发者

数据结构 算法 高性能 双数组trie树 企业号 1 月 PK 榜

软件测试/测试开发 | 接口自动化中如何完成接口加密与解密?

测试人

软件测试 自动化测试 接口测试 测试开发

秒云获评开源GitOps产业联盟“当仁不让 · 最佳分享奖”

MIAOYUN

开源 产业联盟 gitops OGA产业联盟

Object中的wait和notify方法详解

threedayman

面试 并发编程 java;

从 JVM 中深入探究 Synchronized

小小怪下士

Java 程序员 JVM synchronize

认知篇:CQRS架构模式的本质

京东科技开发者

架构 微服务 后端 CQRS 企业号 1 月 PK 榜

2023,不一样的数据库

NineData

数据库 运维 数据开发 数据管理 NineData

网络安全中API常见漏洞

郑州埃文科技

API漏洞

15个 高并发系统设计 锦囊帮助你设计高并发!

风铃架构日知录

Java 程序员 后端 高并发 分库分表

Sam Altman的成功学|升维指南

OneFlow

人工智能 深度学习

资产梳理与应用自动化部署技术实践

智维数据

大数据 数据可视化 智能运维 应用交付平台 流量分析系统

国产射频滤波器公司频岢微电子 完成近两亿元B轮融资

硬科技星球

软件测试/测试开发 | 接口自动化测试,如何实现多套环境的自动化测试?

测试人

软件测试 自动化测试 接口测试 测试开发

市场上常见的5种LED异形屏

Dylan

LED LED显示屏 led显示屏厂家

我们要的一种自学方式,也许是看书自学成才。

叶小鍵

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