您现在的位置是:亿华云 > 热点
SQL 中为什么经常要加 Nolock ?
亿华云2025-10-04 01:11:16【热点】7人已围观
简介刚开始工作的时候,经常听同事说在SQL代码的表后面加上WITH(NOLOCK)会好一些,后来仔细研究测试了一下,终于知道为什么了。那么加与不加到底有什么区别呢?SQL在每次新建一个查询,就相当于创建了
刚开始工作的经常加时候,经常听同事说在SQL代码的经常加表后面加上WITH(NOLOCK)会好一些,后来仔细研究测试了一下,经常加终于知道为什么了。经常加
那么加与不加到底有什么区别呢?经常加
SQL在每次新建一个查询,就相当于创建了一个会话。经常加在不同的经常加查询窗口操作,会影响到其他会话的经常加查询。当某张表正在写数据时,经常加这时候去查询很可能就会一直处于阻塞状态,经常加哪怕你只是经常加一个很简单的SELECT也会一直等待。
我们这里使用事务来往某张表里写数据,经常加我们知道事务在写完表必须提交(COMMIT)或回滚(ROLLBACK)才能释放表,经常加否则会一直处于阻塞状态。经常加
在插入过程中,经常加我们写一个简单的查询语句,在不添加WITH(NOLOCK)和添加WITH(NOLOCK)的情况下,看会发生什么。
示例数据如下表A,是我们新建的一个非常简单的表。
下面我们创建一个往里面写数据的事务(使用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 * FROM A NOLOCK
SELECT * FROM A (NOLOCK);
SELECT * FROM A WITH(NOLOCK);(NOLOCK)这样的写法,NOLOCK其实只是别名的作用,而没有任何实质作用。所以不要粗心将(NOLOCK)写成NOLOCK。
(NOLOCK)与WITH(NOLOCK)其实功能上是一样的。(NOLOCK)只是WITH(NOLOCK)的别名,但是在SQL Server 2008及以后版本中,(NOLOCK)不推荐使用了,"不借助 WITH 关键字指定表提示”的写法已经过时了。
在使用链接服务器的SQL当中,(NOLOCK)不会生效,WITH(NOLOCK)才会生效。
--这样会提示用错误
select * from [IP].[dbname].dbo.tableName with (nolock)
--这样就可以
select * from [dbname].dbo.tableName with(nolock)很赞哦!(62159)
相关文章
- 域后缀首选.com,.net,然后是.cn。后缀选择不当,导致流量损失。域名是企业与互联网网址之间的链接,关键是企业在网络上存在的标志。因此,选择好域名是开展网上工作的首要重要条件。
- 超详细的数据库主机及数据库日志收集总结
- MySQL运维实战之PHP访问MySQL,你使用对了吗
- MySQL和PG到底哪个更好用?
- 在众多公司中,如果我们必须选择一家可信的公司,那当然是信得过的。
- 现代 CSS 解决方案:数学函数之 Min、Max、Clamp
- 程序员挑战龙拳 | 用代码实现刘畊宏龙拳
- 查询数据库,你还在 Select * 吗?
- 3、商标域名一经注册,就可以作为域名裁决过程中的主要信息之一。这可以大大增加公司被抢注的相关域名胜诉的机会。
- 万字长文:分享前端性能优化知识体系