zoukankan      html  css  js  c++  java
  • SQL中为什么经常要加WITH(NOLOCK)

    SQL在每次新建一个查询,就相当于创建了一个会话。在不同的查询窗口操作,会影响到其他会话的查询。当某张表正在写数据时,这时候去查询很可能就会一直处于阻塞状态,哪怕你只是一个很简单的SELECT也会一直等待。

    我们这里使用事务来往某张表里写数据,我们知道事务在写完表必须提交(COMMIT)或回滚(ROLLBACK)才能释放表,否则会一直处于阻塞状态。

     在插入过程中,我们写一个简单的查询语句,在不添加WITH(NOLOCK)和添加WITH(NOLOCK)的情况下,看会发生什么。

    示例数据

    如下表A,是我们新建的一个非常简单的表。

     下面我们创建一个往里面写数据的事务(使用BEGIN TRAN就可以开始一个事务了)

     不添加NOLOCK

    我们新建一个查询窗口,然后查询A表

    从上面的查询可以看到,表A被锁住了,我们的查询一直处于阻塞状态。

    添加NOLOCK

    我们再新建一个查询窗口,还是查询A表,这次我们加上NOLOCK。

    加了NOLOCK后,瞬间就查询出结果了,而且还把事务里即将要插入的数据给查询到了。这是为什么呢?

    事务里的数据虽然还没有提交,但是它实际上已经存在内存里面了,这个时候我们使用NOLOCK查询到的结果,实际上还没存储到硬盘。

    从上面的两个测试可以看出,NOLOCK的作用其实就是为了防止查询时被阻塞,只是这样会产生脏读(未提交的数据)。

    那么一般什么情况下使用NOLOCK呢?

    通常是一些被频繁写的表,不管是插入,更新还是删除。这样的表在查询时,使用NOLOCK是非常有效的。


    WITH(NOLOCK)和NOLOCK的区别

    不知道小伙伴注意没,我前面介绍时是写的WITH(NOLOCK),但是测试时,使用的是(NOLOCK),它们有什么区别呢?

    SQL Server 2008及以后版本中,(NOLOCK)不推荐使用了,"不借助 WITH 关键字指定表提示”的写法已经过时了。

  • 相关阅读:
    C计算double能精确到多少位
    C计算int最大值、最小值
    AndroidStudio右键new无activity
    java替换特殊字符串 $
    lamda表达式排序
    docker toolbox 设置镜像加速
    tomcat优化
    nginx配置相关
    SQL 优化
    elasticsearch 概念初识
  • 原文地址:https://www.cnblogs.com/xiaohuhu/p/13500441.html
Copyright © 2011-2022 走看看