文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SQL Server优化:SQL Server中Nolock关键字的用法

2024-12-02 19:36

关注

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

2、SQL Server有NOLOCK有什么问题

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

2.1 创建数据表

  1. CREATE TABLE [dbo].[userInfo] ( 
  2.   [id] varchar(32) COLLATE Chinese_PRC_CI_AS  NOT NULL
  3.   [userName] nvarchar(30) COLLATE Chinese_PRC_CI_AS  NULL
  4.   [birthday] [dbo].[birthday]  NULL
  5.   CONSTRAINT [PK__userInfo__3213E83F0505C75D]  
  6.   PRIMARY KEY CLUSTERED ([id]) 
  7. WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF
  8.  IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)   
  9. ON [PRIMARY
  10. )   
  11. ON [PRIMARY
  12. GO 
  13. INSERT INTO [dbo].[userInfo] ([id], [userName], [birthday]) 
  14.  VALUES ('123', N'小明''2005-01-02 12:30:00.000'); 
  15. INSERT INTO [dbo].[userInfo] ([id], [userName], [birthday]) 
  16.  VALUES ('125', N'小孙''2005-01-02 12:30:00.000'); 

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

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

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

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

  1. select * from userInfo 

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

  1. select * from userInfo; 
  2. select * from userInfo WITH(NOLOCK); 

2.5 杀掉58会话进程

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

3、NOLOCK使用场景

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

4、nolock和with(nolock)的区别

三种查询写法

  1. SELECT * FROM A NOLOCK; 
  2. SELECT * FROM A (NOLOCK); 
  3. SELECT * FROM A WITH(NOLOCK); 

5、表解锁脚本

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

本文转载自微信公众号「IT技术分享社区」,可以通过以下二维码关注。转载本文请联系IT技术分享社区公众号。

个人博客网站:https://programmerblog.xyz

 

来源: IT技术分享社区内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯