[SQL]提升查询效率与避免LOCK发生nolock: 可能把没有提交事务的数据也显示出来,可能会产生脏读readpast: 会把被锁住的行不显示出来 
所有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/zhangq/p/9548457.html

转SQLSERVER 会不会自动加锁相关推荐

  1. AnkhSVN的自动加锁

    考以下转载文章.配置"[auto-props]",新添加到SVN的文件都会自动加锁,在AnkhSVN插件中,会看到文件前有锁图标,和VSS类似了. 注意,已经添中到SVN中的文件是 ...

  2. 【转】事务和锁机制是什么关系? 开启事务就自动加锁了吗?

    数据库锁 因为数据库要解决并发控制问题.在同一时刻,可能会有多个客户端对同一张表进行操作,比如有的在读取该行数据,其他的尝试去删除它.为了保证数据的一致性,数据库就要对这种并发操作进行控制,因此就有了 ...

  3. SQLServer中一个多用户自动生成编号的过程

    SQLServer中一个多用户自动生成编号的过程 if not exists (select * from dbo.sysobjects where id = object_id(N'[IndexTa ...

  4. sqlserver新增主键自增_深入Mysql,SqlServer,Oracle主键自动增长的设置详解

    1.把主键定义为自动增长标识符类型MySql在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值.例如: create table customers(id i ...

  5. 深入Mysql,SqlServer,Oracle主键自动增长的设置详解

    1.把主键定义为自动增长标识符类型 MySql 在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值.例如: 复制代码 代码如下: create table c ...

  6. linux让新生成的文件自动加锁,Linux_实用技巧一则 Linux系统对文件进行加锁,当有多个工作线程要同时对一 - phpStudy...

    实用技巧一则 Linux系统对文件进行加锁 当有多个工作线程要同时对一个文件进行写操作时,如果不对该文件进行加锁就可能会因误操作而引起一系列的问题. 解决这个问题有多种方法.我们这里考虑使用文件锁来对 ...

  7. sqlserver ADO.net 查询数据库加锁,事务提交

    //逻辑:查询表最大单号,然后锁表(TABLOKX) ,然后执行事务using (SqlConnection conn = EFContext.Database.Connection as SqlCo ...

  8. [总结]SqlServer中如何实现自动备份数据!

    第1种方法: 企业管理器   --管理   --右键数据库维护计划   --新建维护计划   --<下一步>   --选择你要备份的数据库   --<下一步>直到"指 ...

  9. asp.net + ajax + sqlserver 自动补全功能,asp.net+ajax+sqlserver自动补全功能实现解析

    代码下载 说明:数据库连接字符串在web.config文件中,为方便运行使用的是官方的Northwind数据库. 参考(向其作者致敬): ² http://www.loveweb8.com/plus/ ...

最新文章

  1. iOS支付宝(Alipay)接入详细流程,比微信支付更简单,项目实战中的问题分析
  2. 几种可直接使用的架构模式及其使用场景
  3. MATLAB基础操作--命令窗口
  4. 自2018年以来我不知道的事情-Dan Abramov
  5. nginx给php做统一入口,Nginx如何来配置隐藏入口文件index.php(代码)
  6. va_list/va_start/va_arg/va_end深入分析
  7. 在驱动和应用程序间共享内存
  8. java中事务实例,Java Spring 事务管理器入门例子教程(TranscationManager)
  9. 前端和后端的英文_前端工程师一般都喜欢去哪些网站逛?
  10. iptables的详细介绍及配置方法
  11. java视频生成缩略图_Java——使用javacv生成视频缩略图
  12. 【项目实战】——历史数据归档
  13. 微信小程序个人/企业开放服务类目一览表
  14. ActiveMQ详细入门教程系列(一)
  15. 大数据可视化--全球分布散点图
  16. springClude简单配置
  17. 语法错误 : 缺少“;”(在“类型”的前面)的解决方案
  18. 智能车摄像头算法——寻线
  19. android 类对象的存储,android - 以共享首选项存储和检索类对象
  20. 流媒体封装格式和流媒体传输协议介绍

热门文章

  1. php 内链接实现三表,Yii2 hasOne(), hasMany() 实现三表关联的方法(两种)
  2. java读文件指定行开始到文件的最后
  3. eureka server启动后端口变为8080问题解决
  4. php开发面试题---禁用cookie之后,如何使用session
  5. 092:QuerySet API详解-切片操作
  6. (原創) Verilog入門書推薦2:數位系統實習 Quartus II (SOC) (Verilog)
  7. Java10的新特性
  8. 台湾SDN/NFV联盟:集合产业内各部分力量,共同推进NFV技术发展
  9. 《随机出题软件》《随机分队软件》源码(Windows API)
  10. url 编码 js url传参中文乱码解决方案