select * from table with(nolock)
所有Select加 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/hubj/archive/2009/12/31/1636640.html
select * from table with(nolock)相关推荐
- sql SELECT时的with(nolock)选项说明
2019独角兽企业重金招聘Python工程师标准>>> sql SELECT时的with(nolock)选项说明 要提升SQL的查询效能,一般来说大家会以建立索引(index)为第一 ...
- sde执行revoke SELECT ANY TABLE from sde导致报ora-29900 运算符连接不存在错误
在对sde用户权限编辑后,产生的原正常数据不能使用问题. 起因:sde连接数据库后可以看到sde以外的其他数据,遂按http://www.cnblogs.com/chinhr/archive/2011 ...
- Oracle数据库:sql语言结构,数据查询语言DQL,select * from table;算术,别名,连接,去重等操作
Oracle数据库:sql语言结构,数据查询语言DQL,select * from table;算术,别名,连接,去重等操作 2022找工作是学历.能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很 ...
- 数据库语句 select * from table where 1=1 的用法和作用
数据库语句 select * from table where 1=1 的用法和作用 这是一种怎样的查询语句呢?首先说明,1=1不是查询语句中的任何关键词,所以,请您放心,不管你会不会使 ...
- oracle rownum 特别慢,select * from table where rownum=1怎么会特别慢??表的数据在千万左右...
援引我的blog的一篇文章. 这是一篇改写的文章,原文来自 http://www.db-nemec.com/Selecting_ROWNUM_1.html ,我只是结合我的实验重述,如果大家有时间,可 ...
- mysql create table as select from_CREATE TABLE 表名 AS SELECT 语句
1.新表不存在复制表结构即数据到新表 这种方法会将old_table中所有的内容都拷贝过来,用这种方法需要注意,new_table中没有了old_table中的primary key,Extra,au ...
- Arcgis ToolBox学习之二——Extract之select与Table Select
学习记录二: toolbox-Analysis-Extract-select 其实这个工具没什么好说的,和使用下图中的by attribute再导出的结果是一样的 至于table select是将某一 ...
- mysql超过1W条查询不显示_mysql 被写入1W数据后无法select*from table,但是加入limit参数后可以查询...
数据库表结构 innodb SELECT 查询错误提示 ERROR 2013 (HY000): Lost connection to MySQL server during query 我觉得可能是 ...
- select * from table where id=#{id}中id和#{id}是什么意思?
1.id是数据库表中的字段 2.#{id}是你程序获取的一个参数,例如:#{id}为12 这样就形成了你最终的 SQL语句 select * from userinfo where id=12
最新文章
- android 52 粘滞广播
- Visual C++设计UDP协议通讯示例
- python --> Python初阶 --> 基础语法 --> 条件和分支
- LeetCode OJ - Candy
- 云服务器可以文件服务器,云服务器 可以上传文件
- 思科IOS新命名规范详细图解(IOS 12.3) 各版本区别
- 一下代码不符合php,各位帮我看看哪里错了一直提示错误,谢谢大家。可把代码复制一下...
- 用Matlab筛选mirbase,一种基于miRBase数据库的无参的miRNA数据分析方法与流程
- 李某同案律师下挑战书
- 字节跳动疯狂扩张:IPO前的最后一战
- 难道没有GPHONE??
- ‘vue-cli-service‘ is not recognized as an internal or external command
- Python 实现最大回撤
- ubuntu 下测试摄像头过程
- 试用cocos2dx 3.1.1
- 计算机网络(10): 网络层——网络地址转换NAT技术
- LibreOJ 题解汇总
- 计算机概论和发展简史教案,计算机概论教案.pdf
- linux内存条坏了,内存常见故障有哪些,内存故障的解决方法
- 2021 VSCode前端插件推荐
热门文章
- python【蓝桥杯vip练习题库】ADV-313字符串顺序比较
- 【网页前端设计Front end】HTML语言基础.上(看不懂你来打我)
- mysql 8.3_8.3 - mysql 表操作
- python实现多进程同时计算_python多进程实现CPU100%使用
- java中日期计算时间差,用java计算日期/时间差
- sysbench mysql测试_使用sysbench对MySQL进行测试
- java中http解析url,java url 编码(解析http请求汉语言地址 )
- 想做网络推广浅析网站优化中标题该如何设置?
- 网络推广软件介绍外链坚持七大原则助力网站排名“蹭蹭上涨”!
- 打造高端网站应该具备哪些品质?