`

在查询语句中使用 NOLOCK 和 READPAST

阅读更多
<meta content="MSHTML 6.00.2900.3199" name="GENERATOR"> <style></style>2007年05月31日 13:15:00

今天早上我在处理一个数据库死锁的异常时候,怡红公子给我的其中一个建议就是使用 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对应的查询结果中我们没有看到任何一条记录。

清除测试环境方法参看演示一。

参考资料:

Using NOLOCK and READPAST table hints in SQL Server

http://topic.csdn.net/t/20060905/14/4999881.html



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1632674


分享到:
评论

相关推荐

    sqlserver中with(nolock)深入分析

    在查询语句中使用 NOLOCK 和 READPAST 处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK 或者 READPAST 。有关 NOLOCK 和 READPAST的一些技术知识点: 对于非银行等严格要求事务的行业,搜索记录中出现...

    深入分析MSSQL数据库中事务隔离级别和锁机制

    NOLOCK和READPAST的区别。 1. 开启一个事务执行插入数据的操作。 BEGIN TRAN t INSERT INTO Customer SELECT 'a','a' 2. 执行一条查询语句。 SELECT * FROM Customer WITH (NOLOCK) 结果中显示”a”和”a”。...

    Laravel开发-nolock

    Laravel开发-nolock 读取Laravel和Laravel使用联盟文件系统的方式中的锁定文件

    SQL Server的WITH (NOLOCK)

    只适用与select查询语句  优点:  1.有些文件说,加了WITH (NOLOCK)的SQL查询效率可以增加33%。  2.可以用于inner join 语句  脏读: 一个用户对一个资源做了修改,此时另外一个用户正好读取了这条被修改的...

    sql server 性能优化之nolock

    其实除了index的建立之外,当我们在下SQL Command时,在语法中加一段WITH (NOLOCK)可以改善在线大量查询的环境中数据集被LOCK的现象藉此改善查询的效能。  不过有一点千万要注意的就是,WITH (NOLOCK)的SQL SELECT...

    EFCore.SqlServer.WithNoLock

    EFCore.SqlServer.WithNoLock

    使用NOLOCK提示时应考虑的事项

    在考虑使用NOLOCK提示时,应牢记一些注意事项。

    错误信息:select error:由于数据移动,未能继续以NOLOCK方式扫描 脚本文件

    适用于思迅全系列商业进销存软件,在使用软件过程中,在做数据汇总,或者数据日结中如果提示这个错误后,把软件退出,用查询分析器执行此脚本,重新运行软件,就可以解决这个问题,不同的软件替换下对应的数据库名称...

    C语言算法(nolock)

    C语言算法(nolock)这本书非常详细的讲解了C语言常用到的算法,了解了算法的本质。

    CRL快速开发框架2.2

    运行效率:在对象映射上作了缓存处理,查询效率几乎等于手写SQL效率,注:CRL对象查询默认是 with(nolock) 数据安全:所有标准查询都经过参数化处理,无注入风险 动态编译:数据表自动创建/动态存储过程支持与查询转换,极大...

    使用正则表达式匹配tsql注释语句

    代码如下:–获取表的count信息select count(*) from T with(nolock) –获取特定值的count信息select count(*) from T with(nolock)where v = ‘–value’ –获取表’T’的count信息select count(*) from T with...

    SqlSugar框架的学习使用

    3、支持NOLOCK查询,提高性能 4、支持事务 5、内置实体类生成函数,无需使用第三方代码生成器 6、简单好用、例子齐全有问必答。 7、支持.NET CORE 和 MySql、SqlServer、Sqlite、Oracle 、 postgresql 、达梦、...

    经量级的ORM开发框架CRL

    效率问题:在对象映射上作了缓存处理,查询效率几乎等于手写SQL效率,注:CRL对象查询默认是 with(nolock) 数据安全:所有标准查询都经过参数化处理,无注入风险 动态存储过程支持与查询转换,极大减少了数据库维护工作,...

    CRL面向对象ORM开发框架

    效率问题:在对象映射上作了缓存处理,查询效率几乎等于手写SQL效率,注:CRL对象查询默认是 with(nolock) 动态存储过程支持与查询转换,极大减少了数据库维护工作,增加开发效率 最新版本请关注:...

    thread_nolock

    多线程无锁的测试代码,以及其他解决方案的代码对比

    全国身份证+车牌+省市表

    4、示例语句: SELECT ca.code,ca.name,ca.ParentCode,az.name,az.latitude,az.longitude FROM CarArea ca WITH(NOLOCK) LEFT JOIN ( SELECT * FROM AreaZoon WITH(NOLOCK) WHERE parentCode='0' ) az ON az....

    ioking真正无锁的服务器引擎之消息引擎模块(nolock)

    ioking真正无锁的服务器引擎之消息引擎模块:无内核态、无CAS、非lock-free实现了多线程无锁消息传递,适用于服务器性能要求极其苛刻的场景。

    ioking真正无锁的服务器引擎之消息引擎模块(nolock)修订版

    ioking真正无锁的服务器引擎之消息引擎模块:无内核态、无CAS、非lock-free,实现了多线程无锁高效率的消息传递,适用于服务器性能要求极其苛刻的场景。 增加内存消耗提醒等,更多说明请移步本人博客: ...

Global site tag (gtag.js) - Google Analytics