sql server 使用nolock提升性能
2015-08-25 23:47
561 查看
博客园有许多关于nolock的文章,大部分都写得很好,例如:/article/4582525.html
这里仅结合个人项目,作为个人笔记记录。
nolock 的使用方法如:
select * from table1 with(nolock)
with 后面加“锁定提示”,具体的锁定提示有许多种,有表级别,页级别,行级别等等。具体可以参照上面的链接。
nolock 是锁定级别是:不采用任何锁。在允许脏读的情况下,使用nolock可以提升查询性能,避免锁定数据。关键词就是加粗部分了。
脏读的意思是:读取了其它事务中未提交的数据,但该事务可能被回滚。
首先要明确的是,sql server 对于 insert/update/delete 都会加上排它锁,也就是在这几个操作进行时,其它的操作都必须进行等待。而对于select会加上共享锁,也就是在读取时,其它操作只能进行读取。看一个简单的测试,新建两个查询窗口,sql如下:
当查询窗口一的事务没有提交时,其它查询是无法读取的。这是sql server 的默认隔离级别,保证了不会出现脏读。接着我们用 nolock 来测试,查询窗口二的sql改为:
可以看到,即使查询窗口一的事务没有提交,数据依然可以被读取出来。那什么时候出现脏读呢?很简单,当事务rollback时,就读取到脏数据了。
对于一些对数据要求严格的系统,脏读是不可接受的,那么nolock 也就不能使用。但许多时候,我们的查询是可以允许脏读的,因为它带来许多好处。
1. 提升查询性能
从上面的例子可以看到,nolock不受锁的影响,这表示它可以直接读取数据,而不用等到锁释放。
2. 避免锁定数据
这个好处从上面的链接可以理解得更好。有时候我们的 select 可能也是耗时的,上面说到,select会加上共享锁,也就是select的时候,其它事务例如update是无法进行的,如果我们的select执行太久,那么其它操作就可能会因为超时而执行失败。
这里仅结合个人项目,作为个人笔记记录。
nolock 的使用方法如:
select * from table1 with(nolock)
with 后面加“锁定提示”,具体的锁定提示有许多种,有表级别,页级别,行级别等等。具体可以参照上面的链接。
nolock 是锁定级别是:不采用任何锁。在允许脏读的情况下,使用nolock可以提升查询性能,避免锁定数据。关键词就是加粗部分了。
脏读的意思是:读取了其它事务中未提交的数据,但该事务可能被回滚。
首先要明确的是,sql server 对于 insert/update/delete 都会加上排它锁,也就是在这几个操作进行时,其它的操作都必须进行等待。而对于select会加上共享锁,也就是在读取时,其它操作只能进行读取。看一个简单的测试,新建两个查询窗口,sql如下:
--查询窗口一 begin tran update test set c = '2' where id = 2 --查询窗口二 select * from test where id = 2
当查询窗口一的事务没有提交时,其它查询是无法读取的。这是sql server 的默认隔离级别,保证了不会出现脏读。接着我们用 nolock 来测试,查询窗口二的sql改为:
--查询窗口二 select * from test with(nolock) where id = 2
可以看到,即使查询窗口一的事务没有提交,数据依然可以被读取出来。那什么时候出现脏读呢?很简单,当事务rollback时,就读取到脏数据了。
对于一些对数据要求严格的系统,脏读是不可接受的,那么nolock 也就不能使用。但许多时候,我们的查询是可以允许脏读的,因为它带来许多好处。
1. 提升查询性能
从上面的例子可以看到,nolock不受锁的影响,这表示它可以直接读取数据,而不用等到锁释放。
2. 避免锁定数据
这个好处从上面的链接可以理解得更好。有时候我们的 select 可能也是耗时的,上面说到,select会加上共享锁,也就是select的时候,其它事务例如update是无法进行的,如果我们的select执行太久,那么其它操作就可能会因为超时而执行失败。
相关文章推荐
- SQL 在查询结果中增加标记字段
- linux下memcache的运用,和php结合小案例。
- mybatis+mysql返回插入值后的主键id
- 三种方法链接MySQL
- 可视化配置以及Net应用MemCache在win7
- 数据库优化
- oracle对象
- Mysql安装及1067错误相关
- MySQL优化---DBA对MySQL优化的一些总结
- MySQL数据类型和常用字段属性总结
- Sql 中 不等于'<>'与 NULL
- 数据库中索引的优缺点
- mysql 架构分层
- mysql 5.5 手册目录
- oracle 数据备份之exp优化
- mysql到底用哪一款存储引擎呢
- MySQL设置数据库表为只读
- 如何更好地管理你的数据库——navicat(mysql)
- Memcached之你真正理解LRU吗(4)
- mysql声明摘要