`
reb12345reb
  • 浏览: 50196 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

NOLOCK与READPAST

 
阅读更多

在查询语句中使用 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对应的查询结果中我们没有看到任何一条记录。这种情况下就可能发生脏读 

分享到:
评论

相关推荐

    sqlserver中with(nolock)深入分析

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

    数据库中的锁机制.pdf

    例如,高并发读取场景可能更倾向于使用NOLOCK或READPAST来提高性能,而对数据一致性有严格要求的场景则可能需要使用ROWLOCK、HOLDLOCK或TABLOCKX来保证数据的完整性。理解并正确使用锁机制是数据库管理员和开发人员...

    数据库存储过程编写 参考手册

    手册中讲解了简单的正常提交-异常回滚操作、自治事务、以及多用户间锁的处理,包括简单锁定、SQLServer的nolock和READPAST等。 8. 临时表:临时表是用于存储临时数据的数据库对象,它的生命周期通常与数据库会话...

    AlwaysOn技术在携程核心数据库的应用.pdf

    - 为了保证性能和稳定性,制定了严格的编程规范,包括使用NOLOCK或READPAST、错误处理、WHERE子句的使用、参数类型匹配等。 - 也规定了一些禁止和不推荐使用的SQL写法,如避免使用LinkedServers、Truncate、通配符...

    sql锁表与解锁

    SQL 锁表与解锁 锁表 锁表是 SQL Server 中的一种机制,用于控制对数据库表的访问。锁表可以防止多个用户同时修改同一条记录,从而避免数据不一致的问题。SQL Server 提供了多种锁表方式,包括共享锁、排它锁、...

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

    事务隔离级别决定了事务在执行时如何与其他并发事务交互。SQL Server支持四种标准的事务隔离级别: 1. **读未提交(Read Uncommitted)**:允许读取其他事务尚未提交的数据,可能会导致脏读。 2. **读已提交(Read ...

    SQL的锁机制

    - **NOLOCK**:禁止锁定(只读),可能读取到脏数据。 ##### 3. 锁升级与降级 锁升级是指当一个较低级别的锁(如共享锁)不足以满足当前操作需求时,系统自动将其升级为较高级别的锁(如排他锁)。例如,在某些...

    sql server 性能优化(生产中常用)

    - 待搜索的值与表中字段存储的类型必须一致,否则会严重影响查询性能。 - 在可能的情况下,优先使用等号进行查询,因为等号查询比其他类型的比较运算(如大于或小于)的效率更高。 4. SP通过IO次数分析效率 通过...

    高并发性的设计和优化

    - **READPAST**:允许事务跳过已被锁定的数据行,适用于只读场景。 #### 锁的兼容模式 锁之间存在一定的兼容性规则,例如,一个持有共享锁的事务可能允许其他事务也获得共享锁,但不允许获取排他锁。了解并合理...

    微软内部资料-SQL性能优化3

    Contents Overview 1 Lesson 1: Concepts – Locks and Lock Manager 3 Lesson 2: Concepts – Batch and Transaction 31 Lesson 3: Concepts – Locks and Applications 51 Lesson 4: Information Collection and ...

    sqlserver2008锁表语句详解(锁定数据库一个表)

    7. **READPAST**: 此选项允许SQL Server跳过被锁定的行,通常用于`READ UNCOMMITTED`隔离级别,以避免等待锁定的行,提高并发性能。 8. **ROWLOCK**: 强制使用行级锁,防止整个表级别的锁定,提高并发性能。 9...

    sql的update语句功能非常强大.docx

    需要注意的是,不允许使用 `READPAST`、`NOLOCK` 和 `READUNCOMMITTED` 这些提示。 - `view_name`:要更新的视图的名称。只有当视图是可更新的情况下才能使用。更新操作最多只能影响视图的 `FROM` 子句中引用的基表...

Global site tag (gtag.js) - Google Analytics