架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 19976|回复: 3

[资料] Entity Framework 查询优化之 WITH(NOLOCK)

[复制链接]
发表于 2021-1-6 14:52:16 | 显示全部楼层 |阅读模式
首先,本文并不是通过加 WITH(NOLOCK) 来提高查询性能,而是通过事务的隔离机制来读取数据。

在 sql server 数据库中,频繁在同一个数据库表同时进行读写的时候,会存在锁的问题,也就是在前一个insert、update、delete事务操作完毕之前,你不能进行读取,必须要等到操作完毕,你才能进行select操作,目的是为了防止并发操作而读到脏数据。

SELECT语句中加上WITH(NOLOCK)为解决阻塞死锁。

注意:使用 WITH(NOLOCK) 会出现数据脏读的情况

测试代码如下:

使用 Func 委托封装代码如下:

最终生成的sql语句如下:

2021-01-06 14:32:09.9505 [ thread] DEBUG DEBUG LogCenter - sql 语句:SELECT TOP (1)
    [Extent1].[ID] AS [ID],
    [Extent1].[Name] AS [Name]
    FROM [dbo].[Itsvse] AS [Extent1]
    WHERE ([Extent1].[Name] = @p__linq__0) OR (([Extent1].[Name] IS NULL) AND (@p__linq__0 IS NULL))
2021-01-06 14:32:09.9515 [ thread] DEBUG DEBUG LogCenter - sql 语句:

2021-01-06 14:32:09.9525 [ thread] DEBUG DEBUG LogCenter - sql 语句:-- p__linq__0: 'itsvse.com' (Type = String, Size = 4000)

2021-01-06 14:32:09.9525 [ thread] DEBUG DEBUG LogCenter - sql 语句:-- Executing at 2021-01-06 14:32:09 +08:00

2021-01-06 14:32:09.9545 [ thread] DEBUG DEBUG LogCenter - sql 语句:-- Completed in 1 ms with result: SqlDataReader

2021-01-06 14:32:09.9555 [ thread] DEBUG DEBUG LogCenter - sql 语句:

2021-01-06 14:32:09.9555 [ thread] DEBUG DEBUG LogCenter - sql 语句:Closed connection at 2021-01-06 14:32:09 +08:00
select 查询中并没有加入 nolock 关键词。

(完)





上一篇:.NET/C# 基于 BlockingCollection 实现简单日志记录
下一篇:.NET 之 (CLS)公共语言规范
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2021-1-6 14:53:17 | 显示全部楼层
使用:在Global.cs的Application_Start()里面添加如下语句,生成的sql会自动加上with(nolock)
//ef命令拦截器
DbInterception.Add(new WithNoLockInterceptor());
如果执行的sql语句需要锁表,增加如下扩展即可


1、修复了网上提供的正则表达式特殊情况下报错问题

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2021-1-10 10:27:32 | 显示全部楼层
测试 sql 脚本:

测试结果:

默认不加事务,默认隔离级别:

QQ截图20210110102338.jpg

耗时:17561 毫秒

IsolationLevel.ReadUncommitted 隔离级别,如下图:

QQ截图20210110102652.jpg

耗时:519 毫秒

源码:



码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2023-5-2 11:45:35 | 显示全部楼层
ADO.NET 设置允许脏读 ReadUncommitted,代码如下:


还有另外一种写法,dapper 代码如下:

两种写法测试都没有任何问题,推荐直接使用第一种!!!


其它写法:



码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-27 00:22

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表