所有Select加 With (NoLock)解决阻塞死锁
在查询语句中使用 NOLOCK 和 READPAST 
处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK 或者 READPAST 。有关 NOLOCK 和 READPAST的一些技术知识点: 
对于非银行等严格要求事务的行业,搜索记录中出现或者不出现某条记录,都是在可容忍范围内,所以碰到死锁,应该首先考虑,我们业务逻辑是否能容忍出现或者不出现某些记录,而不是寻求对双方都加锁条件下如何解锁的问题。 
NOLOCK 和 READPAST 都是处理查询、插入、删除等操作时候,如何应对锁住的数据记录。但是这时候一定要注意NOLOCK 和 READPAST的局限性,确认你的业务逻辑可以容忍这些记录的出现或者不出现: 
简单来说: 
NOLOCK 可能把没有提交事务的数据也显示出来. 
READPAST 会把被锁住的行不显示出来  
不使用 NOLOCK 和 READPAST ,在 Select 操作时候则有可能报错误:事务(进程 ID **)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。

下面就来演示这个情况。 
为了演示两个事务死锁的情况,我们下面的测试都需要在SQL Server Management Studio中打开两个查询窗口。保证事务不被干扰。

演示一 没有提交的事务,NOLOCK 和 READPAST处理的策略: 
查询窗口一请执行如下脚本: 
CREATE TABLE t1 (c1 int IDENTITY(1,1), c2 int)  go 
BEGIN TRANSACTION  insert t1(c2) values(1)

在查询窗口一执行后,查询窗口二执行如下脚本: 
select count(*) from t1 WITH(NOLOCK)  select count(*) from t1 WITH(READPAST)

结果与分析: 
查询窗口二依次显示统计结果为: 1、0 
查询窗口一的命令没有提交事务,所以 READPAST 不会计算没有提交事务的这一条记录,这一条被锁住了,READPAST 看不到;而NOLOCK则可以看到被锁住的这一条记录。

如果这时候我们在查询窗口二中执行: 
select count(*) from t1 就会看到这个执行很久不能执行完毕,因为这个查询遇到了一个死锁。

清除掉这个测试环境,需要在查询窗口一中再执行如下语句: 
ROLLBACK TRANSACTION  drop table t1

演示二:对被锁住的记录,NOLOCK 和 READPAST处理的策略

这个演示同样需要两个查询窗口。 
请在查询窗口一中执行如下语句: 
CREATE TABLE t2 (UserID int , NickName nvarchar(50))  go  insert t2(UserID,NickName) values(1,'郭红俊')  insert t2(UserID,NickName) values(2,'蝈蝈俊')  go 
BEGIN TRANSACTION  update t2 set NickName = '蝈蝈俊.net' where UserID = 2

请在查询窗口二中执行如下脚本: 
select * from t2 WITH(NOLOCK) where UserID = 2  select * from t2 WITH(READPAST) where UserID = 2

结果与分析: 
查询窗口二中, NOLOCK 对应的查询结果中我们看到了修改后的记录,READPAST对应的查询结果中我们没有看到任何一条记录。 这种情况下就可能发生脏读

转载于:https://www.cnblogs.com/RoyalBlue/p/7155050.html

sqlserver with(nolock)相关推荐

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

    1.为什么SQLServer有NOLOCK关键字? SQLServer没创建一个查询,都相当于创建一个查询会话,在不同的查询分析器里面进行的查询操作,可能会影响别的查询会话.比较典型的一个例子,如果你 ...

  2. 转 sqlserver 中NOLOCK、HOLDLOCK、UPDLOCK、TABLOCK、TABLOCKX

    NOLOCK(不加锁) 此选项被选中时,SQL Server 在读取或修改数据时不加任何锁. 在这种情况下,用户有可能读取到未完成事务(Uncommited Transaction)或回滚(Roll ...

  3. (2021年)IT技术分享社区个人文章汇总(数据库篇)

    时间过的真快,2021年快要结束了,IT技术分享社区公众号,小编坚持每天给大家分享IT技术相关的文章,希望小编分享的文章能够给大家在日常的工作当中,带来一点帮助,也感谢大家对本公众号的支持,未来我会坚 ...

  4. 死锁的产生和解决方法

    1.出错提示:System.Web.HttpUnhandledException (0x80004005): 引发类型为"System.Web.HttpUnhandledException& ...

  5. Sqlserver的merge into或delete语句堵塞了不加with (nolock)的select语句,锁类型是LCK_M_IS

    总结 sqlserver遇到delete删除大量数据时,千万不能直接删除,删除过程会堵塞不加with (nolock)的select语句,锁类型是LCK_M_IS,delete删除过程中,虽然加wit ...

  6. 在sqlserver 中with(nolock)详解

    所有Select加 With (NoLock)解决阻塞死锁 在查询语句中使用 NOLOCK 和 READPAST  处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK 或者 READPA ...

  7. 数据库优化:SqlServer的with(nolock)关键字的用法介绍

    一.with(nolock)的介绍 数据库写查询语句的时候,为了提升查询性能,往往会在查询的表后面加一个nolock,或者是with(nolock),其目的就是查询的时候是不锁定表,从而提高查询速度的 ...

  8. 【SQLSERVER 2000】由于数据移动,未能继续以 NOLOCK 方式扫描

    2019独角兽企业重金招聘Python工程师标准>>> 场景: 数据库为SQLSERVER2000,从生产库脱机备份了整个库的MDF文件和LDF文件,在另外一台机器相同配置环境下恢复 ...

  9. SqlServer中with(nolock)详解

    所有Select加 With (NoLock)解决阻塞死锁,在查询语句中使用 NOLOCK 和 READPAST 有关 NOLOCK 和 READPAST的一些技术知识点: 对于非银行等严格要求事务的 ...

最新文章

  1. java编写提升性能的代码
  2. sql 默认值为0_int 默认值为0
  3. linux复制和剪切命令,Linux命令 复制粘贴剪切
  4. Django:序列化的几种方法
  5. [转] c#中 多线程访问winform控件
  6. 配置管理 ACM 在高可用服务 AHAS 流控降级组件中的应用场景
  7. Linux集群和自动化维1.3 如何根据服务器应用选购服务器
  8. linux怎么读取kvaser的数据,基于Python下的Kavasers CAN报文收发调试
  9. 进度图绘制十大注意事项
  10. Nifi从入门到精通(一)之 数据存储
  11. 策略模式和责任链模式
  12. python转pyd
  13. 循环队列以数组Q【0,...,m-1】存储结构,rear表示循环队列中的队尾元素的实际位置,移动按rear=(rear+1)/MODm,length表示当前循环队列中的元素个数,循环队列队首实际位置。
  14. 互联网3D数字化时代,3D产品展示开启新商机
  15. 2020年营收仅62.5万,九城凭什么砸1亿美金购买矿机?
  16. GDPR(欧盟通用数据保护条例)基础知识
  17. 360云盘丢失资料,官方承诺的永不删除丢失和绝对保密纯属忽悠
  18. Honest Coach
  19. 【PC】完美解决 office2010 错误1920 未能启动服务 “Office Software Protection Platform”(osppsvc)
  20. 未来科学大奖迎首位女性得主:密码学家王小云获百万美元奖金

热门文章

  1. cmos和ccd区别对比
  2. 凯利讯半导体滤波器的种类与作用
  3. [iOS]Advanced Memory Management Programming Guide 高级内存管理编程指南(官方文档翻译)
  4. 你刷我,我刷你,霸榜CLUE甜蜜蜜
  5. 2021 工业信息安全技能大赛 线上赛第一场--隐藏的工程
  6. vijos1153 猫狗大战
  7. 如何申请Xilinx评估版本ip核license
  8. python应用——将raw文件转化为jpg文件,并显示图像
  9. 笑话:在暗恋的女神家上厕所的悲剧
  10. python莫比乌斯_用python绘出一个莫比乌斯环