刚在查sql表名后面加个 with(nolock),后面发现有遍文章解释蛮清楚。
资料来源:http://blog.csdn.net/clq271520093/archive/2009/11/10/4792960.aspx

所有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/hubj/archive/2009/12/31/1636640.html

select * from table with(nolock)相关推荐

  1. sql SELECT时的with(nolock)选项说明

    2019独角兽企业重金招聘Python工程师标准>>> sql SELECT时的with(nolock)选项说明 要提升SQL的查询效能,一般来说大家会以建立索引(index)为第一 ...

  2. sde执行revoke SELECT ANY TABLE from sde导致报ora-29900 运算符连接不存在错误

    在对sde用户权限编辑后,产生的原正常数据不能使用问题. 起因:sde连接数据库后可以看到sde以外的其他数据,遂按http://www.cnblogs.com/chinhr/archive/2011 ...

  3. Oracle数据库:sql语言结构,数据查询语言DQL,select * from table;算术,别名,连接,去重等操作

    Oracle数据库:sql语言结构,数据查询语言DQL,select * from table;算术,别名,连接,去重等操作 2022找工作是学历.能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很 ...

  4. 数据库语句 select * from table where 1=1 的用法和作用

    数据库语句 select * from table where 1=1 的用法和作用        这是一种怎样的查询语句呢?首先说明,1=1不是查询语句中的任何关键词,所以,请您放心,不管你会不会使 ...

  5. oracle rownum 特别慢,select * from table where rownum=1怎么会特别慢??表的数据在千万左右...

    援引我的blog的一篇文章. 这是一篇改写的文章,原文来自 http://www.db-nemec.com/Selecting_ROWNUM_1.html ,我只是结合我的实验重述,如果大家有时间,可 ...

  6. mysql create table as select from_CREATE TABLE 表名 AS SELECT 语句

    1.新表不存在复制表结构即数据到新表 这种方法会将old_table中所有的内容都拷贝过来,用这种方法需要注意,new_table中没有了old_table中的primary key,Extra,au ...

  7. Arcgis ToolBox学习之二——Extract之select与Table Select

    学习记录二: toolbox-Analysis-Extract-select 其实这个工具没什么好说的,和使用下图中的by attribute再导出的结果是一样的 至于table select是将某一 ...

  8. mysql超过1W条查询不显示_mysql 被写入1W数据后无法select*from table,但是加入limit参数后可以查询...

    数据库表结构 innodb SELECT 查询错误提示 ERROR 2013 (HY000): Lost connection to MySQL server during query 我觉得可能是 ...

  9. select * from table where id=#{id}中id和#{id}是什么意思?

    1.id是数据库表中的字段 2.#{id}是你程序获取的一个参数,例如:#{id}为12 这样就形成了你最终的 SQL语句 select * from userinfo where id=12

最新文章

  1. android 52 粘滞广播
  2. Visual C++设计UDP协议通讯示例
  3. python --> Python初阶 --> 基础语法 --> 条件和分支
  4. LeetCode OJ - Candy
  5. 云服务器可以文件服务器,云服务器 可以上传文件
  6. 思科IOS新命名规范详细图解(IOS 12.3) 各版本区别
  7. 一下代码不符合php,各位帮我看看哪里错了一直提示错误,谢谢大家。可把代码复制一下...
  8. 用Matlab筛选mirbase,一种基于miRBase数据库的无参的miRNA数据分析方法与流程
  9. 李某同案律师下挑战书
  10. 字节跳动疯狂扩张:IPO前的最后一战
  11. 难道没有GPHONE??
  12. ‘vue-cli-service‘ is not recognized as an internal or external command
  13. Python 实现最大回撤
  14. ubuntu 下测试摄像头过程
  15. 试用cocos2dx 3.1.1
  16. 计算机网络(10): 网络层——网络地址转换NAT技术
  17. LibreOJ 题解汇总
  18. 计算机概论和发展简史教案,计算机概论教案.pdf
  19. linux内存条坏了,内存常见故障有哪些,内存故障的解决方法
  20. 2021 VSCode前端插件推荐

热门文章

  1. python【蓝桥杯vip练习题库】ADV-313字符串顺序比较
  2. 【网页前端设计Front end】HTML语言基础.上(看不懂你来打我)
  3. mysql 8.3_8.3 - mysql 表操作
  4. python实现多进程同时计算_python多进程实现CPU100%使用
  5. java中日期计算时间差,用java计算日期/时间差
  6. sysbench mysql测试_使用sysbench对MySQL进行测试
  7. java中http解析url,java url 编码(解析http请求汉语言地址 )
  8. 想做网络推广浅析网站优化中标题该如何设置?
  9. 网络推广软件介绍外链坚持七大原则助力网站排名“蹭蹭上涨”!
  10. 打造高端网站应该具备哪些品质?