sqlserver with(nolock)
处理一个数据库死锁的异常时候,其中一个建议就是使用 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)相关推荐
- SQLServer优化:SQLServer中NOLOCK关键字的用法介绍
1.为什么SQLServer有NOLOCK关键字? SQLServer没创建一个查询,都相当于创建一个查询会话,在不同的查询分析器里面进行的查询操作,可能会影响别的查询会话.比较典型的一个例子,如果你 ...
- 转 sqlserver 中NOLOCK、HOLDLOCK、UPDLOCK、TABLOCK、TABLOCKX
NOLOCK(不加锁) 此选项被选中时,SQL Server 在读取或修改数据时不加任何锁. 在这种情况下,用户有可能读取到未完成事务(Uncommited Transaction)或回滚(Roll ...
- (2021年)IT技术分享社区个人文章汇总(数据库篇)
时间过的真快,2021年快要结束了,IT技术分享社区公众号,小编坚持每天给大家分享IT技术相关的文章,希望小编分享的文章能够给大家在日常的工作当中,带来一点帮助,也感谢大家对本公众号的支持,未来我会坚 ...
- 死锁的产生和解决方法
1.出错提示:System.Web.HttpUnhandledException (0x80004005): 引发类型为"System.Web.HttpUnhandledException& ...
- Sqlserver的merge into或delete语句堵塞了不加with (nolock)的select语句,锁类型是LCK_M_IS
总结 sqlserver遇到delete删除大量数据时,千万不能直接删除,删除过程会堵塞不加with (nolock)的select语句,锁类型是LCK_M_IS,delete删除过程中,虽然加wit ...
- 在sqlserver 中with(nolock)详解
所有Select加 With (NoLock)解决阻塞死锁 在查询语句中使用 NOLOCK 和 READPAST 处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK 或者 READPA ...
- 数据库优化:SqlServer的with(nolock)关键字的用法介绍
一.with(nolock)的介绍 数据库写查询语句的时候,为了提升查询性能,往往会在查询的表后面加一个nolock,或者是with(nolock),其目的就是查询的时候是不锁定表,从而提高查询速度的 ...
- 【SQLSERVER 2000】由于数据移动,未能继续以 NOLOCK 方式扫描
2019独角兽企业重金招聘Python工程师标准>>> 场景: 数据库为SQLSERVER2000,从生产库脱机备份了整个库的MDF文件和LDF文件,在另外一台机器相同配置环境下恢复 ...
- SqlServer中with(nolock)详解
所有Select加 With (NoLock)解决阻塞死锁,在查询语句中使用 NOLOCK 和 READPAST 有关 NOLOCK 和 READPAST的一些技术知识点: 对于非银行等严格要求事务的 ...
最新文章
- java编写提升性能的代码
- sql 默认值为0_int 默认值为0
- linux复制和剪切命令,Linux命令 复制粘贴剪切
- Django:序列化的几种方法
- [转] c#中 多线程访问winform控件
- 配置管理 ACM 在高可用服务 AHAS 流控降级组件中的应用场景
- Linux集群和自动化维1.3 如何根据服务器应用选购服务器
- linux怎么读取kvaser的数据,基于Python下的Kavasers CAN报文收发调试
- 进度图绘制十大注意事项
- Nifi从入门到精通(一)之 数据存储
- 策略模式和责任链模式
- python转pyd
- 循环队列以数组Q【0,...,m-1】存储结构,rear表示循环队列中的队尾元素的实际位置,移动按rear=(rear+1)/MODm,length表示当前循环队列中的元素个数,循环队列队首实际位置。
- 互联网3D数字化时代,3D产品展示开启新商机
- 2020年营收仅62.5万,九城凭什么砸1亿美金购买矿机?
- GDPR(欧盟通用数据保护条例)基础知识
- 360云盘丢失资料,官方承诺的永不删除丢失和绝对保密纯属忽悠
- Honest Coach
- 【PC】完美解决 office2010 错误1920 未能启动服务 “Office Software Protection Platform”(osppsvc)
- 未来科学大奖迎首位女性得主:密码学家王小云获百万美元奖金