SQLServer优化:SQLServer中NOLOCK关键字的用法介绍

目录

1、为什么SQLServer有NOLOCK关键字?

2、SQLServer有NOLOCK有什么问题

3、NOLOCK使用场景

4、nolock和with(nolock)的区别

5、表解锁脚本


      7c5ac0350f9d45faba0710978ed1a964.png         

1、为什么SQLServer有NOLOCK关键字?

SQLServer没创建一个查询,都相当于创建一个查询会话,在不同的查询分析器里面进行的查询操作,可能会影响别的查询会话。比较典型的一个例子,如果你正在使用事务执行某一张表的插入或者操作而没有正确关闭事务的情况下,会造成别的会话针对该数据表的查询都会处于阻塞的状态,从而不能完成查询的操作。这个时候有两个解决方案,第一种查询到阻塞的会话id然后杀掉该会话id,

第二种可以使用WITH(NOLOCK)关键字忽略掉阻塞的会话直接查询出结果。

简单来说NOLOCK关键字的作用是防止查询的时候被别的会话阻塞,从而顺利完成查询的操作。

2、SQLServer有NOLOCK有什么问题

使用NOLOCK关键字可以避免阻塞造成无法查询出数据,但使用该关键字会有造成数据脏读的可能。下面举个例子

2.1  创建数据表

CREATE TABLE [dbo].[userInfo] ([id] varchar(32) COLLATE Chinese_PRC_CI_AS  NOT NULL,[userName] nvarchar(30) COLLATE Chinese_PRC_CI_AS  NULL,[birthday] [dbo].[birthday]  NULL,CONSTRAINT [PK__userInfo__3213E83F0505C75D] PRIMARY KEY CLUSTERED ([id])
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)  
ON [PRIMARY]
)  
ON [PRIMARY]
GO
INSERT INTO [dbo].[userInfo] ([id], [userName], [birthday])VALUES ('123', N'小明', '2005-01-02 12:30:00.000');
INSERT INTO [dbo].[userInfo] ([id], [userName], [birthday])VALUES ('125', N'小孙', '2005-01-02 12:30:00.000');

2.2  创建时候 会话id 为58 开启事务 不关闭事务

begin tran 
insert into userInfo (id,userName,birthday)
values ('127','小张','2015-01-02 12:30:00.000')
--commit tran

2.3  当前会话(58)还可以查询出数据

事务还没有提交 此时数据还在内存中,未保存到数据库当中

select * from userInfo

       e58927563e2cb4cb33a82610b5ff180b.png        

2.4 新建一个查询会话 当前新建的id是51

select * from userInfo;
select * from userInfo WITH(NOLOCK);

       13bcfbcea2164933e79a6f6c57ea4f73.png        

       eed5258968c208705fbdae0d93768b09.png        

2.5  杀掉58会话进程

declare @spid  int 
Set @spid  = 58 --锁表进程
declare @sql varchar(1000)
set @sql='kill '+cast(@spid  as varchar)
exec(@sql)

       ad3253e17fbc066db83266a68cfad0cc.png        

3、NOLOCK使用场景

针对那些被频繁操作(插入、更新、删除)的表,使用NOLOCK是非常比较适合的,但要考虑到脏读的情况。

  • 不经常修改的数据表,省掉锁定表的时间来大大加快查询速度。

  • 数据量非常大的数据表,可以考虑牺牲数据安全性来提升查询的效率;

  • 允许出现脏读现象的业务逻辑,对数据完整性要求比较严格的场景不适合,比如电商、银行等系统。

  • 当使用NoLock时,它允许阅读那些已经修改但是还没有结束事务的数据。因此要考虑transaction事务数据的实时完整性时,不建议使用。

4、nolock和with(nolock)的区别

三种查询写法

SELECT * FROM A NOLOCK;
SELECT * FROM A (NOLOCK);
SELECT * FROM A WITH(NOLOCK);

1、SQLServer2005版本中,只支持with(nolock)关键字

2、with(nolock)的写法非常容易再指定索引

3、跨数据库服务器查询语句时不能用with (nolock) 只能用nolock,同数据服务器查询时 两者都可以用

-- SQL Server 2008版本之后建议采用WITH(NOLOCK)写法。

5、表解锁脚本

-- 查询被锁表
select request_session_id   spid
,OBJECT_NAME(resource_associated_entity_id) tableName   
from   sys.dm_tran_locks where resource_type='OBJECT';
--参数说明 spid   锁表进程 ;tableName   被锁表名
-- 解锁语句 需要拿到spid然后杀掉缩表进程
declare @spid  int 
Set @spid  = 57 --锁表进程
declare @sql varchar(1000)
set @sql='kill '+cast(@spid  as varchar)
exec(@sql)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/270424.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20144303 20145239 实验三

20144303 20145239 实验三 实验内容 1、首先连接好实验箱电源,用串口线、并口线、网线、连接实验箱和主机 2、安装ADS并破解 安装文件在00-ads1.2目录下,破解方法在00-ads1.2\Crack目录下 3、安装GIVEIO驱动(安装文件在01-GIVEIO目录下) 把整个GIVEIO目录…

oracle无法创建监听器,关于Oracle net Manager中点击无法创建监听程序的解决方案

首先查看你的环境变量中是否有如果没有请添加该环境变量。变量名为:TNS_ADMIN 变量值为:E:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN;(如果你更改了默认目录,请找到相应的目录加进去),添加完成之后,…

办公技巧:分享5个非常好用的Excel插件

❤️作者主页:IT技术分享社区 ❤️作者简介:大家好,我是IT技术分享社区的博主,从事C#、Java开发九年,对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉: 数据库领域优质创作者🏆&#x…

weblogic安全漫谈

今天,我来与大家探讨一下关于weblogic的话题 在进入内网后,如图: 当我们看到7001时,我们就可以测试weblogic反序列化漏洞,如图: 证明,漏洞存在,查看一下权限,如图&#x…

linux使进程不依赖终端,Linux nohup命令应用简介--让Linux的进程不受终端影响

nohup命令应用简介--让Linux的进程不受终端影响by:授客QQ:1033553122#开启ping进程[rootlocalhost ~]# pinglocalhost &[2] 4169[1]Terminatednohup ping localhost[rootlocalhost ~]# PINGlocalhost (127.0.0.1) 56(84) bytes of data.64 bytes from localhost…

电脑技巧:Win10操作系统设置定时开机图解教程

❤️作者主页:IT技术分享社区 ❤️作者简介:大家好,我是IT技术分享社区的博主,从事C#、Java开发九年,对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉: 数据库领域优质创作者🏆&#x…

JavaScript对UNIX时间戳的转换

<script type"text/javascript">   var timestamp 1479886513;   var d new Date(timestamp * 1000); //根据时间戳生成的时间对象   var date (d.getFullYear()) "-"     (d.getMonth() 1) "-"     (d.getDate())…

网络技巧:想要WiFi信号满格,路由器应该这样放

现如今人手一部手机 不知不觉 WiFi也成了生活“必需品” 刷视频正入迷视频却突然卡顿 换个房间就收不到WiFi信号 如此令人抓狂的事情 生活中你一定遇到过 其实 这与路由器的错误摆放有很大关系 家庭无线路由器 放置在哪里信号最好&#xff1f; WiFi信号差如何解决&#xff1f; …

linux系统export,Linux入门进阶 - 如何在Linux中使用export命令

原标题&#xff1a;Linux入门进阶 - 如何在Linux中使用export命令来自&#xff1a; Linux迷链接&#xff1a;https://www.linuxmi.com/linux-export.htmlLinux export命令会标记哪些值需要传递给一组子进程。这是bash shell提供的一个简单但有用的特性。它允许管理员在不中断当…

Duilib开发环境搭建

1.到github上下载最新版本&#xff0c;https://github.com/duilib/duilib&#xff0c;也没有发现版本号&#xff0c;就如图所示吧 2.我只安装了VS2008&#xff0c;而github上的已经更新到VS2013了&#xff0c;所以要手动修改SIN工程文件 把sln文件打开&#xff0c;将最上面的2行…

手机技巧:手机丢了记住这四步操作,让你的损失降到最低

随着扫码支付的普及、智慧生活的升级&#xff0c;没有钱包能付账&#xff0c;没有公交卡能乘车&#xff0c;没有银行卡也能取款&#xff0c;只要你手机在手&#xff0c;手机手机钱包身份证银行卡各种支付密码。但你是否想过&#xff0c;如果某一天手机丢了&#xff0c;该怎么办…

linux下搭建vsftp锁定根目录,Linux服务搭建之vsftp

安装vsftpubuntu14.04sudo apt-get install vsftp&#xff12;&#xff0e;配置文件/etc/vsftp.congf&#xff13;&#xff0e;相关配置write-enableYES允许上传文件local_enableYES允许/etc/passwd中记录的用户登录ftp匿名用户登录&#xff1a;# 允许匿名用户登录anonymous_en…

mysql共享锁

共享锁 共享锁指的就是对于多个不同的事务&#xff0c;对同一个资源共享同一个锁。相当于对于同一把门&#xff0c;它拥有多个钥匙一样。就像这样&#xff0c;你家有一个大门&#xff0c;大门的钥匙有好几把&#xff0c;你有一把&#xff0c;你女朋友有一把&#xff0c;你们都…

YII2 随笔 视图最佳实践

yii\base\Controller::render(): 渲染一个 视图名 并使用一个 布局 返回到渲染结果。yii\base\Controller::renderPartial(): 渲染一个 视图名 并且不使用布局。yii\web\Controller::renderAjax(): 渲染一个 视图名 并且不使用布局&#xff0c; 并注入所有注册的JS/CSS脚本和文…

网络技巧:无线路由器越用越慢的解决方法

目录 01 ​​​​​​​路由器越用越慢很平常 02 国区设置不要乱用 03 很容易被遗忘的IPv6设置 04 学会自我检查掉线问题 05 番外篇&#xff1a;测试自己的网速 “耳机、音箱通过一定时间的煲机&#xff0c;表现效果会变好&#xff0c;可为何家里WiFi网络却老是给人越用越慢、越…

Mac软件:15个提升办公效率的软件

目录 1.解压软件&#xff1a;RAR Extractor - The Unarchiver Pro 2.实用清理软件&#xff1a;CleanMyMac X 3.水族屏保软件:Desktop Aquarium Wallpaper‪s 4.桌面图标隐藏工具&#xff1a;Desktop Curtain 5.剪贴板工具&#xff1a;Paste 6.快捷键查看软件&#xff1a;Cheats…

乐观锁介绍

1.乐观锁介绍 乐观锁&#xff08; Optimistic Locking &#xff09; 相对悲观锁而言&#xff0c;乐观锁假设认为数据一般情况下不会造成冲突&#xff0c;所以在数据进行提交更新的时候&#xff0c;才会正式对数据的冲突与否进行检测&#xff0c;如果发现冲突了&#xff0c;则让…

从0开始学习 GitHub 系列之「03.Git 速成」

前面的 GitHub 系列文章介绍过&#xff0c;GitHub 是基于 Git 的&#xff0c;所以也就意味着 Git 是基础&#xff0c;如果你不会 Git &#xff0c;那么接下来你完全继续不下去&#xff0c;所以今天的教程就来说说 Git &#xff0c;当然关于 Git 的知识单凭一篇文章肯定说不完的…