• SQLServer中巧用nolock 提升应用程序性能
  • 无名 发表于 2016/3/28 12:39:00 | 分类标签: nolock 性能优化
  •  nolock 的使用方法如:

    select * from table1 with(nolock)

    with 后面加“锁定提示”,具体的锁定提示有许多种,有表级别,页级别,行级别等等。具体可以参照上面的链接。

    nolock 是锁定级别是:不采用任何锁。在允许脏读的情况下,使用nolock可以提升查询性能避免锁定数据。关键词就是加粗部分了。

    脏读的意思是:读取了其它事务中未提交的数据,但该事务可能被回滚。

    首先要明确的是,sql server 对于 insert/update/delete 都会加上排它锁,也就是在这几个操作进行时,其它的操作都必须进行等待。而对于select会加上共享锁,也就是在读取时,其它操作只能进行读取。看一个简单的测试,新建两个查询窗口,sql如下:

    1
    2
    3
    4
    5
    6
    --查询窗口一
    begin tran
    update test set c = '2' where id = 2
     
    --查询窗口二
    select from test where id = 2

    当查询窗口一的事务没有提交时,其它查询是无法读取的。这是sql server 的默认隔离级别,保证了不会出现脏读。接着我们用 nolock 来测试,查询窗口二的sql改为:

    1
    2
    --查询窗口二
    select from test with(nolock) where id = 2

    可以看到,即使查询窗口一的事务没有提交,数据依然可以被读取出来。那什么时候出现脏读呢?很简单,当事务rollback时,就读取到脏数据了。

    对于一些对数据要求严格的系统,脏读是不可接受的,那么nolock 也就不能使用。但许多时候,我们的查询是可以允许脏读的,因为它带来许多好处。

    1. 提升查询性能

    从上面的例子可以看到,nolock不受锁的影响,这表示它可以直接读取数据,而不用等到锁释放。

    2. 避免锁定数据

    这个好处从上面的链接可以理解得更好。有时候我们的 select 可能也是耗时的,上面说到,select会加上共享锁,也就是select的时候,其它事务例如update是无法进行的,如果我们的select执行太久,那么其它操作就可能会因为超时而执行失败。

  • 请您注意

    ·自觉遵守:爱国、守法、自律、真实、文明的原则

    ·尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规

    ·严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的作品

    ·承担一切因您的行为而直接或间接导致的民事或刑事法律责任

    ·您在编程中国社区新闻评论发表的作品,本网站有权在网站内保留、转载、引用或者删除

    ·参与本评论即表明您已经阅读并接受上述条款

  • 感谢本文作者
  • 作者头像
  • 昵称:无名
  • 加入时间:2014/6/1 14:45:00
  • TA的签名
  • 这家伙很懒,虾米都没写
  • +进入TA的空间
  • 以下内容也很赞哦
分享按钮