SQLServer优化:SQLServer中NOLOCK关键字的用法介绍
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
2.4 新建一个查询会话 当前新建的id是51
select * from userInfo;
select * from userInfo WITH(NOLOCK);
2.5 杀掉58会话进程
declare @spid int
Set @spid = 58 --锁表进程
declare @sql varchar(1000)
set @sql='kill '+cast(@spid as varchar)
exec(@sql)
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)
IT技术分享社区
个人博客网站:https://programmerblog.xyz
文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识
SQLServer优化:SQLServer中NOLOCK关键字的用法介绍相关推荐
- 数据库优化:SqlServer的with(nolock)关键字的用法介绍
一.with(nolock)的介绍 数据库写查询语句的时候,为了提升查询性能,往往会在查询的表后面加一个nolock,或者是with(nolock),其目的就是查询的时候是不锁定表,从而提高查询速度的 ...
- escape mysql_MySQL中ESCAPE关键字的用法详解
MySQL转义 转义即表示转义字符原来的语义,一个转义字符的目的是开始一个字符序列,使得转义字符开头的该字符序列具有不同于该字符序列单独出现时的语义. MySQL中,转义字符以"" ...
- C#.NET验证码智能识别学习笔记---02-C#.Net中Using关键字的用法
C#.NET验证码智能识别学习笔记---02-C#.Net中Using关键字的用法 技术qq交流群:JavaDream:251572072 教程下载,在线交流:it.yunsit.cn ------ ...
- MySQL中ESCAPE关键字的用法详解
MySQL中ESCAPE关键字的用法详解 MySQL中ESCAPE关键字的用法详解 1. mysql转义概述 2. escape验证 MySQL中ESCAPE关键字的用法详解 1. mysql转义概述 ...
- mysql escape关键字_MySQL中ESCAPE关键字的用法详解
MySQL转义 转义即表示转义字符原来的语义,一个转义字符的目的是开始一个字符序列,使得转义字符开头的该字符序列具有不同于该字符序列单独出现时的语义. MySQL中,转义字符以"\" ...
- python中mean的用法_python 的numpy库中的mean()函数用法介绍
1. mean() 函数定义: numpy.mean(a, axis=None, dtype=None, out=None, keepdims=)[source] Compute the arithm ...
- python 的numpy库中的mean()函数用法介绍
这篇文章主要介绍了python 的numpy库中的mean()函数用法介绍,具有很好对参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 mean() 函数定义: 2 mean()函数功能: 求取均 ...
- python average函数怎么用_python 的numpy库中的mean()函数用法介绍
1. mean() 函数定义: numpy.mean(a, axis=None, dtype=None, out=None, keepdims=)[source] Compute the arithm ...
- java编程里的values怎么使用,详解Java编程中super关键字的用法
这篇文章主要介绍了Java编程中this与super关键字的用法,包括从内存结构方面分析super的作用域,需要的朋友可以参考下 通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程 ...
最新文章
- 最小生成树算法详解(prim+kruskal)
- Oracle中的序列 sequence 用法
- 防外挂和防木马的通用解决方案
- 数据结构之图:无向图的介绍与功能实现,Python——22
- MySQL数据库的数据类型以及取值范围详解
- 怎么看调用的接口_Hadoop RPC调用实例分析
- 信息学奥赛一本通 1103:陶陶摘苹果 |1930:【05NOIP普及组】陶陶摘苹果 | OpenJudge NOI 1.6 02 | 洛谷 P1046 [NOIP2005 普及组] 陶陶摘苹果
- ICommand接口
- spyder selenium配置
- html Table 转CSV中文乱码解决
- 【拆解】便携示波器怎么选?
- 单片机简易开发板怎么设计,我来告诉你
- html显示tooltips,提示工具 | Tooltips
- 软件测试DAY3-执行用例
- Matlab中FrechetDistance方法实现---比较两条曲线的相似性,并绘制曲线
- 先锋机器人Pioneer3 DX使用
- 聚观早报 | 苹果iOS 16.1正式版更新;魅族储备汽车领域相关人才
- eNSP模拟下的vlanif配置实现(一个汇聚交换机,两个接入交换机)通过三层交换机实现vlan间的三层通信
- confluence 删除_Confluence 清理已经删除的页面(完全删除)
- Java项目结构的总体理解
热门文章
- 微博VS微信,谁更有移动优势
- 遥感图像增强方法应用
- C#:invoke 与 BeginInvoke使用区别
- U-boot给kernel传参数和kernel读取参数—struct tag
- 【数据库学习笔记】——操作sqlite(增删改查)以及cursor的方法介绍
- c语言生命游戏代码大全,c++生命游戏源码
- python中英文半角还是全角_Python3全角转半角的方法
- 普通调幅(AM)与抑制载波双边带调幅(DSB)matlab编程实现
- [Jobdu] 题目1337:寻找最长合法括号序列
- IE11下用forms身份验证的问题