转SQLSERVER 会不会自动加锁
[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 会不会自动加锁相关推荐
- AnkhSVN的自动加锁
考以下转载文章.配置"[auto-props]",新添加到SVN的文件都会自动加锁,在AnkhSVN插件中,会看到文件前有锁图标,和VSS类似了. 注意,已经添中到SVN中的文件是 ...
- 【转】事务和锁机制是什么关系? 开启事务就自动加锁了吗?
数据库锁 因为数据库要解决并发控制问题.在同一时刻,可能会有多个客户端对同一张表进行操作,比如有的在读取该行数据,其他的尝试去删除它.为了保证数据的一致性,数据库就要对这种并发操作进行控制,因此就有了 ...
- SQLServer中一个多用户自动生成编号的过程
SQLServer中一个多用户自动生成编号的过程 if not exists (select * from dbo.sysobjects where id = object_id(N'[IndexTa ...
- sqlserver新增主键自增_深入Mysql,SqlServer,Oracle主键自动增长的设置详解
1.把主键定义为自动增长标识符类型MySql在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值.例如: create table customers(id i ...
- 深入Mysql,SqlServer,Oracle主键自动增长的设置详解
1.把主键定义为自动增长标识符类型 MySql 在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值.例如: 复制代码 代码如下: create table c ...
- linux让新生成的文件自动加锁,Linux_实用技巧一则 Linux系统对文件进行加锁,当有多个工作线程要同时对一 - phpStudy...
实用技巧一则 Linux系统对文件进行加锁 当有多个工作线程要同时对一个文件进行写操作时,如果不对该文件进行加锁就可能会因误操作而引起一系列的问题. 解决这个问题有多种方法.我们这里考虑使用文件锁来对 ...
- sqlserver ADO.net 查询数据库加锁,事务提交
//逻辑:查询表最大单号,然后锁表(TABLOKX) ,然后执行事务using (SqlConnection conn = EFContext.Database.Connection as SqlCo ...
- [总结]SqlServer中如何实现自动备份数据!
第1种方法: 企业管理器 --管理 --右键数据库维护计划 --新建维护计划 --<下一步> --选择你要备份的数据库 --<下一步>直到"指 ...
- asp.net + ajax + sqlserver 自动补全功能,asp.net+ajax+sqlserver自动补全功能实现解析
代码下载 说明:数据库连接字符串在web.config文件中,为方便运行使用的是官方的Northwind数据库. 参考(向其作者致敬): ² http://www.loveweb8.com/plus/ ...
最新文章
- iOS支付宝(Alipay)接入详细流程,比微信支付更简单,项目实战中的问题分析
- 几种可直接使用的架构模式及其使用场景
- MATLAB基础操作--命令窗口
- 自2018年以来我不知道的事情-Dan Abramov
- nginx给php做统一入口,Nginx如何来配置隐藏入口文件index.php(代码)
- va_list/va_start/va_arg/va_end深入分析
- 在驱动和应用程序间共享内存
- java中事务实例,Java Spring 事务管理器入门例子教程(TranscationManager)
- 前端和后端的英文_前端工程师一般都喜欢去哪些网站逛?
- iptables的详细介绍及配置方法
- java视频生成缩略图_Java——使用javacv生成视频缩略图
- 【项目实战】——历史数据归档
- 微信小程序个人/企业开放服务类目一览表
- ActiveMQ详细入门教程系列(一)
- 大数据可视化--全球分布散点图
- springClude简单配置
- 语法错误 : 缺少“;”(在“类型”的前面)的解决方案
- 智能车摄像头算法——寻线
- android 类对象的存储,android - 以共享首选项存储和检索类对象
- 流媒体封装格式和流媒体传输协议介绍
热门文章
- php 内链接实现三表,Yii2 hasOne(), hasMany() 实现三表关联的方法(两种)
- java读文件指定行开始到文件的最后
- eureka server启动后端口变为8080问题解决
- php开发面试题---禁用cookie之后,如何使用session
- 092:QuerySet API详解-切片操作
- (原創) Verilog入門書推薦2:數位系統實習 Quartus II (SOC) (Verilog)
- Java10的新特性
- 台湾SDN/NFV联盟:集合产业内各部分力量,共同推进NFV技术发展
- 《随机出题软件》《随机分队软件》源码(Windows API)
- url 编码 js url传参中文乱码解决方案