`

nolock查询

阅读更多

今天仔细研究NOLOCK并且测试了下,终于理解了,那么加与不加到底区别在哪呢?

我先说下其区别,之后再做测试。 大家都知道,每新建一个查询,都相当于创建一个会话,在不同的查询分析器里面进行的操作,可以影响到其他会话的查询,极端的情况可能会一直处于阻塞中,哪怕只是一个很简单的查询都“特别慢”。

BEGIN TRAN 是开始一个事务的意思,开始之后可执行一些SQL语句,接着需要执行COMMIT进行提交或者ROLLBACK进行回滚,否则就会出现上面的情况。

但如果使用NOLOCK进行查询的时候,就不会因为别的回话没有提交或回滚,而受阻塞。

 

用以下语句来总结:

NOLOCK能使当前会话的查询,不受其它会话的事务所阻塞。但是这样做,就读取了其它事务的“修改后未提交的”数据。

 

案例

现在我们进行测试,一定要注意,必须在多个会话下才可以,也就是说,需要建三个查询分析器窗口。 表用最简单的表,自己动手建一个。 

查询分析器一:执行 SELECT * FROM dbo.test_main 得到 id value1 one2 two3 three4 four 接着执行如下:

BEGIN TRAN INSERT INTO test_main VALUES(5, 'five') 一行受影响 

查询分析器二:执行 SELECT * FROM dbo.test_main 则卡死,受上一会话所阻塞。查不出结果。 补充:那么卡死怎么办呢?我们已经说过,要执行提交或者回滚操作才可以,那么在会话一中执行COMMIT即可。 之后此查询立刻显示结果。 

查询分析器三:执行 SELECT * FROM test_main(NOLOCK) 则显示如下 id value1 one2 two3 three4 four 5 five 但最后一行并没有真正存储在数据库中,因为会话一还没有进行提交,我们用NOLOCK就查询出来了。 

 

也许你会想,那什么情况下用NOLOCK呢?

经过我们的分析,用NOLOCK是为了避免出现卡死状态,那我们就可以分析其环境了。 一个经常操作的表,并且每次操作都很重要,这样一般要用到事务进行处理,因为可以避免出错的几率,我们查询时,要用NOLOCK,否则遇上卡死的几率很大。别人执行一个事务,还没处理完呢,你就查询了,那就卡死了。有了NOLOCK就可以解决这个问题了。

分享到:
评论

相关推荐

    EFCore.SqlServer.WithNoLock

    标题“EFCore.SqlServer.WithNoLock”涉及到的是在C#编程环境中使用Entity Framework Core(简称EF Core)与SQL Server数据库进行交互时,如何利用“WITH (NOLOCK)”提示来提高查询性能。这是一个针对数据库事务隔离...

    SqlSugar引用文件

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

    SqlSugar框架的学习使用

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

    Laravel开发-nolock

    然而,如果在读取数据时使用了`WITH(NOLOCK)`这样的SQL提示符,那么可以实现无锁读取,这在大数据查询或低并发环境下可能是一个有效的优化策略。 无锁读取(NOLOCK)的使用需谨慎,因为它可能会读取到未提交的数据...

    SQL Server的WITH (NOLOCK)

    缺点:  1.会产生脏读  2.只适用与select查询语句  优点:  1.有些文件说,加了WITH (NOLOCK)的SQL...其实除了index的建立之外,当我们在下SQL Command时,在语法中加一段WITH (NOLOCK)可以改善在线大量查询的环

    sqlserver中with(nolock)深入分析

    `NOLOCK`提示是一种表级锁定提示,它告诉SQL Server在执行查询时不获取任何共享锁(读锁)。这意味着查询可以读取未提交的数据,这被称为“脏读”。脏读可能导致不一致的结果,因为用户可能看到尚未被其他事务正式...

    sql server 性能优化之nolock

    "nolock"是一个SQL查询提示,用于控制事务隔离级别,它允许查询在不获取锁的情况下读取数据,从而提高查询速度。这个特性是SQL Server性能优化的一个策略,尤其适用于需要快速响应的实时查询场景。 在描述中提到,...

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

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

    Sql Server参数化查询之where in和like实现详解

    Sql Server参数化查询之where in和like实现详解 在Sql Server中,参数化查询是提高查询性能和防止SQL注入攻击的有效方法之一。其中,where in和like是两个常用的查询条件,然而它们的参数化实现却不是那么简单。...

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

    在SQL Server数据库管理中,`NOLOCK`是一个事务隔离级别的提示,它允许查询在读取数据时跳过锁定,从而提高并发性能。然而,使用`NOLOCK`并不是无风险的,需要谨慎处理。以下是关于使用`NOLOCK`提示时应考虑的一些...

    百万数据查询优化技巧三十则

    29. **使用 `WITH (NOLOCK)` 或 `READ UNCOMMITTED`:** 这些提示可以减少锁的竞争,但可能会引入脏读的问题。 30. **考虑使用索引提示:** 在某些情况下,可以使用索引提示来强制优化器使用特定索引。 综上所述,...

    SQLservices锁表查询

    ### SQLservices锁表查询知识点详解 #### 一、SQL服务中的锁机制理解 在数据库管理系统中,锁(Lock)是一种非常重要的并发控制机制,用于确保数据的一致性和完整性。SQL Server 使用锁来管理多个用户对同一资源...

    sql中的select语句查询介绍

    查询完成后,你不应该忘记手动关闭它们,除非使用`WITH NOLOCK`选项来避免自动锁定。如果表已经打开,`SELECT`会使用`USE ... AGAIN`重新打开。 `SELECT`子句允许你指定一系列返回的结果,包括: 1. 通配符`*`代表...

    SqlServer参数化查询之where in和like实现详解

    在SQL Server中,参数化查询是一种优化查询性能的重要方法,尤其是在处理大量数据时。它能够防止SQL注入攻击,并且能够更好地利用数据库的查询缓存,提高执行效率。本文将详细讲解如何实现`WHERE IN`和`LIKE`操作的...

    SQL Server SQL优化

    `WITH (NOLOCK)`可以减少锁定操作,从而加速查询速度,但这也会带来潜在的数据一致性问题(脏读)。因此,在使用时需要谨慎评估其利弊。 - **推荐做法**:在可以接受脏读的情况下使用`WITH (NOLOCK)`,如`SELECT ...

    从统计数据表记录总数谈sqlserver优化

    3. **考虑使用NOLOCK提示**:如果表经常被更新,并且查询记录总数的需求不是很频繁,可以考虑使用`NOLOCK`提示来提高并发性,但需要注意可能引入的脏读问题。 六、总结 通过对统计数据表记录总数的查询优化,我们...

    SQL中in参数化的用法

    SQL 中 IN 参数化的用法详解 在 SQL 中,对于 IN 操作符的使用是非常常见的...我们可以使用参数化查询来实现 where in 和 like 的参数化查询,提高 SQL 的查询性能和安全性。但是需要根据实际情况选择合适的解决方案。

    sql server递归子节点、父节点sql查询表结构的实例

    在SQL Server中,递归查询是一种强大的工具,用于处理层级数据或树状结构的数据,例如组织结构、部门关系等。本文将深入探讨如何利用递归查询来获取子节点和父节点的信息。 一、查询当前部门下的所有子部门 在SQL ...

Global site tag (gtag.js) - Google Analytics