nolock的用法你知道啵

    今天在排查问题的过程中,看见开发在存储过程有查询语句使用了with(nolock) 关键字。借此我也想了解这个函数的用途。

先说下概念:提升SQL查询效能,多数会以建索引(index)为首要考虑,其实还有一个改善的语法:在表后加nolock或with(nolock),目的是查询不锁表,提高查询速度,减少数据库Dead Lock。

缺点:1: 产生脏读 2: 只适用select查询语句。

优点:部分资料证明,加了with(nolock)的sql查询效率可增加33%。

可以用于inner join语句。

SELECT COUNT(UserID) 

FROM EMPLOYEE WITH (NOLOCK) 

JOIN WORKING_GROUP WITH (NOLOCK)
ON EMPLOYEE.UserID = WORKING_GROUP.UserID

补充下nolock引起的相关的其他几种数据读取的名词解释--

关于脏读(Dirty Read)解释:不同用户,第一个正在对某资源进行修改,同时第二个用户正好读取第一个用户修改后的数据,但第一个用户放弃修改,数据回到修改之前,不同的返回结果造成脏读。

不可重复读:这里涉及到事务,当一个用户操作的是一个事务,这个事务分两次读取同一条记录,如果第一次读取完毕,有另外一用户修改了这个数据,这时第一个用户读取的是第二个用户修改后的数据,如果事务中加锁可以避免。

幻读:当用户读取一批数据,用户查询同一条件的一批记录,如果第一次查询完毕,其他用户对这批数据进行修改,删除,新增;当他第二次查询时,会发现第一次查询的记录条目不在第二次查询的数据集中,或者第二次查询的数据未出现在第一次查询的结果集中,由此引发幻读。

锁:每个事务对所依赖的资源会请求不同类型的锁,可阻止其他事务因某种可能导致事务请求锁出错的方式修改资源。当事务不再依赖锁定的资源时,锁将被释放。根据不通过的锁类型可划分:

表类型:锁定整个表 。行类型:锁整个表 。文件类型:锁定某个数据库文件。 数据库类型:锁整个数据库。 页类型:锁定8K为单位的数据库页。 根据用户和数据库对象划分
 

共享(S):不更改,不更新数据库(只读操作),常见select语句,这个用的较多。

更新(U):用于可更新资源中,防止当多个会话在读取,锁定以及资源更新时发生常见的死锁。

排它(X):用于数据修改操作,如insert,update或delete,避免同一时间进行资源多重更新。

小结(建议--- 如果项目中的每个查询都加上一句with(nolock)是不科学的,而且很浪费时间,可怕的会出现技术漏洞,最好使用行版本控制。一般数据量特别大的表,牺牲数据安全性来提升性能是可以考虑的。允许出现脏数据现象的业务逻辑,数据不经常修改的表,这个可以考虑,金融行业还是少用为好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章