SQL Server 中WITH (NOLOCK)浅析

优点

  • 有些文件说,加了WITH (NOLOCK)的SQL查询效率可以增加33%。
  • 可以用于inner join 语句

缺点

  • 会产生脏读
  • 只适用与select查询语句
脏读: 一个用户对一个资源做了修改,此时另外一个用户正好读取了这条被修改的记录,然后,第一个用户放弃修改,数据回到修改之前,这两个不同的结果就是脏读。

详细内容:

要提升SQL的查询效能,一般来说大家会以建立索引(index)为第一考虑。
其实除了index的建立之外,当我们在下SQL Command时,在语法中加一段WITH (NOLOCK)可以改善在线大量查询的环境中数据集被LOCK的现象藉此改善查询的效能。

不过有一点千万要注意的就是,WITH (NOLOCK)的SQL SELECT有可能会造成Dirty Read(脏读)。
例:
SELECT COUNT(UserID) 
FROM EMPLOYEE WITH (NOLOCK) 
JOIN WORKING_GROUP WITH (NOLOCK) 
ON EMPLOYEE.UserID = WORKING_GROUP.UserID

除了简单的SELECT之外,有JOINSELECT语法也是可以使用的。
但是DELETEINSERTUPDATE这些需要transaction的指令就不行了


有些文件说,加了WITH (NOLOCK)的SQL查询效率可以增加33%。
加了WITH (NOLOCK)即告诉SQL Server
我们的这段SELECT指令无需去考虑目前tabletransaction lock状态
因此效能上会有明显的提升
而且数据库系统的Lock现象会有明显的减少(包含Dead Lock)。

有 一点要特别注意,因为WITH (NOLOCK)不考虑目前tabletransaction lock
因此当有某些资料正处于多个phase交易
(例如跨多个tabletransaction交易-->如提款系统)
WITH (NOLOCK)会让目前处理交易process的数据被忽略…

讲白话一点,也就是说当使用NoLock时
它允许阅读那些已经修改但是还没有交易完成的数据。
因此如果有需要考虑transaction事务数据的实时完整性时
使用WITH (NOLOCK)就要好好考虑一下。

如果不需考虑transactionWITH (NOLOCK)或许是个好用的参考。
注1:WITH ( < table_hint > )
指定由查询优化器使用的表扫描、一或多个索引
或由查询优化器利用此数据表以及为此语句使用锁定模式
注2:WITH (NOLOCK)相当于READ UNCOMMITTED
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的世界没光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值