zoukankan      html  css  js  c++  java
  • Sql Server :SELECT a.*,b.HZXM FROM YG_LIS_JCBYTK a(nolock)中的NOLOCK作用

    转自 http://blog.csdn.net/xingxing1828/article/details/34850771

    先说下其区别,之后再做测试。

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

        BEGIN TRAN 是开始一个事务的意思,开始之后可执行一些SQL语句,接着需要执行COMMIT进行提交或者ROLLBACK进行回滚,否则就会出现上面的情况。但如果 使用NOLOCK进行查询的时候,就不会因为别的回话没有提交或回滚,而受阻塞。所以概括起来,可以用以下语句来总结:

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

        现在我们进行测试,一定要注意,必须在多个会话下才可以,也就是说,需要建三个查询分析器窗口。

        表用最简单的表,自己动手建一个。

        查询分析器一:执行

           SELECT * FROM dbo.test_main

           得到

            id    value
            1     one
            2     two
            3     three
            4     four

           接着执行如下:

           BEGIN TRAN
           INSERT INTO test_main VALUES(5, 'five')

           一行受影响   

        查询分析器二:执行

          SELECT * FROM dbo.test_main

          则卡死,受上一会话所阻塞。查不出结果。

          补充:那么卡死怎么办呢?我们已经说过,要执行提交或者回滚操作才可以,那么在会话一中执行COMMIT即可。 之后此查询立刻显示结果。

        查询分析器三:执行

           SELECT * FROM test_main(NOLOCK)

          则显示如下

           id    value
            1     one
            2     two
            3     three
            4     four

            5     five

           但最后一行并没有真正存储在数据库中,因为会话一还没有进行提交,我们用NOLOCK就查询出来了。

      也许你会想,那什么情况下用NOLOCK呢?经过我们的分析,用NOLOCK是为了避免出现卡死状态,那我们就可以分析其环境了。

      一个经常操作的表,并且每次操作都很重要,这样一般要用到事务进行处理,因为可以避免出错的几率,

    我们查询时,要用NOLOCK,否则遇上卡死的几率很大。别人执行一个事务,还没处理完呢,你就查询了,那就卡死了。有了NOLOCK就可以解决这个问题了。


    设计到一个脏数据的概念:

     

    脏数据临时更新(脏读)产生

    事务A更新了某数据项X,由于某种原因事务A出现了问题,于要把A回滚,回滚之前另事务B读取了数据项X值(A更新),A回滚了事务数据项恢复了原值事务,B读取数据项X临时值脏数据。



    如果不需考虑transaction,WITH (NOLOCK)或许是个好用的参考。

    注1:WITH ( < table_hint > )
    指定由查询优化器使用的表扫描、一或多个索引,
    或由查询优化器利用此数据表以及为此语句使用锁定模式。

    注2:WITH (NOLOCK)相当于READ UNCOMMITTED
     
    最后说下nolock和with(nolock)的几个小区别:
     1:SQL05中的同义词,只支持with(nolock);
     2:with(nolock)的写法非常容易再指定索引。 
    跨服务器查询语句时 不能用with (nolock) 只能用nolock
    同一个服务器查询时 则with (nolock)和nolock都可以用
    比如
    SQL code 
    select * from [IP].a.dbo.table1 with (nolock) 这样会提示用错误select * from a.dbo.table1 with (nolock) 这样就可以
  • 相关阅读:
    03-串联
    大数据项目之电商数仓(3电商数据仓库系统)V6.1.3
    JQuery实现tab页
    Java面试题之计算字符/字符串出现的次数
    ios 苹果内购订单验证 --- nodejs实现
    ios 苹果内购订单验证 --- php实现
    Android内购订单验证 --- nodejs实现
    Android内购订单验证 --- php实现
    Google Compute Engine VM自动调节
    php性能优化 --- laravel 性能优化
  • 原文地址:https://www.cnblogs.com/xyao1/p/7605211.html
Copyright © 2011-2022 走看看