commit|SQL中为什么经常要加NOLOCK?
本文插图
作者:丶平凡世界
来源: SQL数据库开发
刚开始工作的时候 , 经常听同事说在SQL代码的表后面加上WITH(NOLOCK)会好一些 , 后来仔细研究测试了一下 , 终于知道为什么了 。
那么加与不加到底有什么区别呢?
SQL在每次新建一个查询 , 就相当于创建了一个会话 。 在不同的查询窗口操作 , 会影响到其他会话的查询 。 当某张表正在写数据时 , 这时候去查询很可能就会一直处于阻塞状态 , 哪怕你只是一个很简单的SELECT也会一直等待 。
我们这里使用事务来往某张表里写数据 , 我们知道事务在写完表必须提交(COMMIT)或回滚(ROLLBACK)才能释放表 , 否则会一直处于阻塞状态 。
在插入过程中 , 我们写一个简单的查询语句 , 在不添加WITH(NOLOCK)和添加WITH(NOLOCK)的情况下 , 看会发生什么 。
示例数据
如下表A , 是我们新建的一个非常简单的表 。
本文插图
【commit|SQL中为什么经常要加NOLOCK?】下面我们创建一个往里面写数据的事务(使用BEGIN TRAN就可以开始一个事务了)
本文插图
我们发现有1行受影响了 , 注意这里的会话ID是59(左上角黄色标签上的数字)
不添加NOLOCK
我们新建一个查询窗口 , 然后查询A表
本文插图
从上面的查询可以看到 , 表A被锁住了 , 我们的查询一直处于阻塞状态 。 这里的会话ID是60
这个时候如果你在会话59的窗口执行COMMIT或ROLLBACK , 会话60的查询结果会立刻显示出来 , 这里为了下面的演示我们暂时不提交或回滚 。
添加NOLOCK
我们再新建一个查询窗口 , 还是查询A表 , 这次我们加上NOLOCK 。
本文插图
注意上图标红色的地方 , 当前会话ID是55 , 旁边的60还在执行状态 , 而我们加了NOLOCK后 , 瞬间就查询出结果了 , 而且还把事务里即将要插入的数据给查询到了 。 这是为什么呢?
事务里的数据虽然还没有提交 , 但是它实际上已经存在内存里面了 , 这个时候我们使用NOLOCK查询到的结果 , 实际上还没存储到硬盘 。
从上面的两个测试可以看出 , NOLOCK的作用其实就是为了防止查询时被阻塞 , 只是这样会产生脏读(未提交的数据) 。
那么一般什么情况下使用NOLOCK呢?
通常是一些被频繁写的表 , 不管是插入 , 更新还是删除 。 这样的表在查询时 , 使用NOLOCK是非常有效的 。
WITH(NOLOCK)和NOLOCK的区别
不知道小伙伴注意没 , 我前面介绍时是写的WITH(NOLOCK) , 但是测试时 , 使用的是(NOLOCK) , 它们有什么区别呢?
为了搞清楚WITH(NOLOCK)与NOLOCK的区别 , 我们先看看下面三个SQL语句有啥区别
SELECT* FROMA NOLOCKSELECT * FROMA (NOLOCK)SELECT* FROMA WITH(NOLOCK)
- (NOLOCK)这样的写法 , NOLOCK其实只是别名的作用 , 而没有任何实质作用 。 所以不要粗心将(NOLOCK)写成NOLOCK
- (NOLOCK)与WITH(NOLOCK)其实功能上是一样的 。 (NOLOCK)只是WITH(NOLOCK)的别名,但是在SQL Server 2008及以后版本中 , (NOLOCK)不推荐使用了 , "不借助 WITH 关键字指定表提示”的写法已经过时了 。
推荐阅读
- 温枪|为什么测温枪一下子就能测出人体的温度?
- 科学|为什么没有人被暗物质杀死?
- |为什么微信用户这么多,QQ还能成为中国第二大社交软件?
- 设备|投屏功能为什么如此重要
- 科学|为什么动物能直接喝脏水,而人类喝水需要过滤?
- 凤凰网|投屏功能为什么如此重要
- 群众网|为什么富人选择创业,穷人却选择打工?
- 群众网|马云的妻子张瑛有多优秀?为什么她不像刘强东妻子章泽天那样经常出现?
- |变声器为什么一定要有实时变声功能?能实现什么有趣的玩法?
- 技术编程,区块链|ETH测试网Medalla为什么提倡验证者尝试多个客户端?