SQLSERVER中WITH(NOLOCK)详解 [转]

SQLSERVER中WITH(NOLOCK)详解 [转] NOLOCK 和 READPAST 都是处理查询、插入、删除等操作时候,如何应对锁住的数据记录。 简单来说: NOLOCK 可能把没有提交事务的数据也显示出来. READPAST 会把被锁住的行不显示出来 不使用 NOLOCK 和 READPAST ,在 Select

SQLSERVER中WITH(NOLOCK)详解 [转]

nolock 和 readpast 都是处理查询、插入、删除等操作时候,如何应对锁住的数据记录。

简单来说:

NOLOCK 可能把没有提交事务的数据也显示出来.

READPAST 会把被锁住的行不显示出来

不使用 NOLOCK 和 READPAST ,网站空间,在 Select 操作时候则有可能报错误:事务(进程 ID **)与另一个进程被死锁在 锁 资源上,虚拟主机,并且已被选作死锁牺牲品。

演示一 没有提交的事务,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,’lucas’) 
insert t2(UserID,NickName) values(2,’fuckcpp’) 
go

BEGIN TRANSACTION 
update t2 set NickName = ‘fuckcpp.net’ where UserID = 2

 

请在查询窗口二中执行如下脚本:

select * from t2 WITH(NOLOCK) where UserID = 2 
select * from t2 WITH(READPAST) where UserID = 2

 

结果与分析:

查询窗口二中, NOLOCK 对应的查询结果中我们看到了修改后的记录,READPAST对应的查询结果中我们没有看到任何一条记录。 这种情况下就可能发生脏读

posted on

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/1848197.html

(0)
上一篇 2025年2月22日 01:33:44
下一篇 2025年2月22日 01:34:19

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • navicat数据库连接url怎么写

    Navicat连接URL格式为:协议://用户名:密码@主机:端口/数据库名称?参数,包含了连接所需的信息,包括协议、用户名、密码、主机名、端口、数据库名称和可选参数。 Navicat 连接 URL 的格式 Navicat 是一个数据库管理…

    2025年2月23日
    100
  • navicat没有localhost怎么办

    Navicat 中没有 localhost 服务器可能是因为数据库服务未启动、服务器别名配置不正确、防火墙阻止访问、别名与实例不匹配或远程连接问题。解决方法包括启动数据库服务、正确配置服务器别名、允许端口 1433 入站连接、匹配服务器别名…

    2025年2月23日
    100
  • navicat怎么连接sqlserver

    可以通过以下步骤在 Navicat 中连接到 SQL Server 数据库:1. 启动 Navicat;2. 新建 SQL Server 连接;3. 配置连接参数;4. 验证连接;5. 保存连接;6. 双击连接进行连接。 Navicat 连…

    2025年2月23日
    100
  • navicat怎么连sqlserver

    通过 Navicat 连接 SQL Server:获取 SQL Server 连接信息(服务器地址、端口、数据库、用户名、密码)。在 Navicat 中创建新连接,选择 SQL Server 数据库类型。配置连接详细信息,包括主机、端口、数…

    2025年2月23日
    100
  • php连接sqlserver五种方法是什么

    PHP连接SQLServer的五种方法如下:1、使用“mssql_connect()”函数;2、使用“sqlsrv_connect()”函数;3、使用PDO类连接;4、使用“odbc_connect()”函数;5、使用COM对象方式连接。 …

    2025年2月23日
    100
  • 介绍win10 下 php7.0.X 添加Sqlserver扩展

    第一步、7.0.12下载扩展并配置服务器 7.0.x的扩展下载地址: Microsoft Drivers for PHP for SQL Server  https://www.microsoft.com/en-us/download/de…

    2025年2月23日 编程技术
    100
  • PHP key_exists()函数用法详解

    php中的key_exists()函数用于检查指定的键是否存在于数组中。这个函数非常重要,因为在使用数组时需要检查数组中是否存在某个键,以便正确地处理数据。 key_exists()函数的语法如下: bool key_exists(mixe…

    编程技术 2025年2月23日
    100
  • PHP函数库中range()函数用法详解

    php是一种流行的开源服务器端脚本语言。在php中,函数是编写重复代码的一种方法,而php函数库是一组方便编写php代码的预定义函数。其中,range()函数是php函数库中的一种常用函数,本文将详细介绍range()函数的用法。 rang…

    编程技术 2025年2月23日
    100
  • PHP中的哈希算法详解

    php中的哈希算法详解 在PHP开发中,哈希算法是常用的一种加密技术,它可以将任意长度的数据转化为固定长度的哈希值。哈希算法在密码学、数据完整性校验以及数据快速查找等方面都有着广泛的应用。在本文中,我们将详细介绍PHP中的哈希算法,并提供一…

    编程技术 2025年2月23日
    100
  • php-fpm调优方法详解

    php-fpm是一种常用的php进程管理器,用于提供更好的php性能和稳定性。然而,在高负载环境下,php-fpm的默认配置可能无法满足需求,因此我们需要对其进行调优。本文将详细介绍php-fpm的调优方法,并给出一些代码示例。 一、增加进…

    编程技术 2025年2月22日
    100

发表回复

登录后才能评论