none
問個問題,比較奇怪。。 RRS feed

  • 问题




  • select Entry_no from WIP_D_truck_entry(nolock) where truck_entry_no='10150163664' and plant_code= 'MI04'


    為什麽還是能被其他session阻塞住?
    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2009年10月30日 6:21

答案

  • “nolock” 不等于“no lock”
    nolock 是处理查询、插入、删除等操作时候,如何应对锁住的数据记录的一种策略方式,可能把没有提交事务的数据也显示出来,而并不是说就没有lock了
    2009年11月2日 2:09
    版主
  • nolock是指在查询数据时不会去尝试获在数据上得共享锁,这样就不会因为锁的兼容问题而被其它的session阻塞。 相当于READUNCOMMITTED.
    需要注意的是,sql server获得锁的方式是从先获得intent lock,成功后再去获得实际的lock(粗粒度到细粒度).  所以,即使使用了nolock,只能保证在实际的数据(例如,粒度为“行”)不会被阻塞,但实际上读取时在尝试获得intent lock时就被阻塞了(假设session1获得了tablelevel的排他锁,之后session2再去使用nolock)。 具体是如何被阻塞的依据情况而定,你可以使用sp_lock查看

     

     


    Wison Ho你可以读一些inside sql server的lock and concurrency这章,理解起来就容易多了。


    有dba的职位吗
    • 已标记为答案 Wison-Ho 2009年11月6日 3:59
    2009年11月5日 2:49
    版主

全部回复




  • SQLServer 2000 here

    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2009年10月30日 6:22

  • 这是有可能的,例如session1改变了一个表的底层结构, session2使用nolock也会不阻塞,你可以查看一定是什么类型的阻塞,很有意思的...
    有dba的职位吗
    2009年10月30日 8:38
    版主
  • Nolock means this select statement will not lock table queried, but can't stop other process to lock table.
    2009年10月30日 20:26



  • select Entry_no from WIP_D_truck_entry(nolock) where truck_entry_no='10150163664' and plant_code= 'MI04'


    為什麽還是能被其他session阻塞住?
    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.

    提供sp_who看看
    with(nolock) 相当于未提交读的呀
    More: blog.csdn.net/happyflystone
    2009年11月1日 14:30
  • “nolock” 不等于“no lock”
    nolock 是处理查询、插入、删除等操作时候,如何应对锁住的数据记录的一种策略方式,可能把没有提交事务的数据也显示出来,而并不是说就没有lock了
    2009年11月2日 2:09
    版主



  • 看Jerrynet的說法是:nolock是對存在鎖的數據的一種存取方式,不管需求的數據是什麽類型的數據,都可以查詢出來

    好像rmiao的意思是:nolock表示你在select的時候是不會對需求的數據加鎖的。

    到底誰是正確的?
    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2009年11月4日 16:27
  • nolock是指在查询数据时不会去尝试获在数据上得共享锁,这样就不会因为锁的兼容问题而被其它的session阻塞。 相当于READUNCOMMITTED.
    需要注意的是,sql server获得锁的方式是从先获得intent lock,成功后再去获得实际的lock(粗粒度到细粒度).  所以,即使使用了nolock,只能保证在实际的数据(例如,粒度为“行”)不会被阻塞,但实际上读取时在尝试获得intent lock时就被阻塞了(假设session1获得了tablelevel的排他锁,之后session2再去使用nolock)。 具体是如何被阻塞的依据情况而定,你可以使用sp_lock查看

     

     


    Wison Ho你可以读一些inside sql server的lock and concurrency这章,理解起来就容易多了。


    有dba的职位吗
    • 已标记为答案 Wison-Ho 2009年11月6日 3:59
    2009年11月5日 2:49
    版主



  • 看Jerrynet的說法是:nolock是對存在鎖的數據的一種存取方式,不管需求的數據是什麽類型的數據,都可以查詢出來

    好像rmiao的意思是:nolock表示你在select的時候是不會對需求的數據加鎖的。

    到底誰是正確的?
    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    You can test it easily. Open a session to lock table then open another sission to read data from that table with nolock hint.
    2009年11月5日 15:29
  • nolock是指在查询数据时不会去尝试获在数据上得共享锁,这样就不会因为锁的兼容问题而被其它的session阻塞。 相当于READUNCOMMITTED.
    需要注意的是,sql server获得锁的方式是从先获得intent lock,成功后再去获得实际的lock(粗粒度到细粒度).  所以,即使使用了nolock,只能保证在实际的数据(例如,粒度为“行”)不会被阻塞,但实际上读取时在尝试获得intent lock时就被阻塞了(假设session1获得了tablelevel的排他锁,之后session2再去使用nolock)。 具体是如何被阻塞的依据情况而定,你可以使用sp_lock查看

     

     


    Wison Ho你可以读一些inside sql server的lock and concurrency这章,理解起来就容易多了。


    有dba的职位吗

     




    灰常感謝你的詳細解答。

    對了 ,請問一下,inside sqlserver 的全稱是?

    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2009年11月6日 3:59
  • 其中的一本 《inside sql server:storage engine》
    有dba的职位吗
    2009年11月6日 13:06
    版主