none
死锁是怎样产生的? RRS feed

答案

  • http://blog.csdn.net/happyflystone/archive/2009/10/26/4728234.aspx


    死锁

    首先,我们得清楚死锁与等待是两回事。等待是当前进程所需要的资源让另一个进程排它了,只要另外一个进程释放,当时进程就可以继续执行(当然如果另外这个进程已经死锁那会进入无限期等待,但是这种情况一般不会发生,因为SQLSERVER会干预死锁的。另外我们还有一个锁定超时设置 ,这方面大家可以看联机丛书)。而死锁是发生在两个进程间,在没有人为干预两个锁定的进程是都无法继续工作的一种困境。另外一个显著的地方就是死锁一旦发生,SQLSERVER就会干预进来,我们所能感知比如接收到1205号错误,健壮的应用系统会人工干预1205错误,恰当的重新提交批处理,当1205错误发生没有终止的进程获得相应的资源并处理自己的事务直至释放资源,其实这种人为的干预潜在的又为死锁提供一个外在环境。当然我们前面写的一个过程也可以查询到相应的锁定信息。

    接着,死锁是无法完全避免的。在一个并发的多用户系统,锁定、线程、内存、并行查询、MARS中死锁的发生是正常的、可以预见的,也是必然的。在我们能力范围内只能尽可能的在应用端或服务器上恰当的处理死锁,使得这种无法完全避免的事件给系统带来的影响降到最低。也就是我们应该明白:死锁是无法完全避免,但是我可以降低发生的次数。

    ......
    ......
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/happyflystone/archive/2009/10/26/4728234.aspx


    More: blog.csdn.net/happyflystone
    2009年11月1日 5:02
  • 查询默认会对表加共享锁,避免脏读。如果在查询的同时,查询的表在被更新,那么查询就会一直等待更新完成后才能返回。

    如果容许脏读,那么可以使用with nolock 关键字,例如:

    select * from tablename with(nolock)

    这个就不会出现死锁了。
    family as water
    • 已标记为答案 SQL STUDIO 2009年11月1日 13:15
    2009年11月1日 6:55

全部回复

  • 当两个进程互相等待对方占有的资源,但双方都不释放对方所需要的资源,导致等待一直进行下去,除非外部的干涉才会结束。
    由于查询需要共享锁,但由于所要查询的记录已经有独占锁,所以会造成等待甚至死锁。
    2009年11月1日 2:23
  • http://blog.csdn.net/happyflystone/archive/2009/10/26/4728234.aspx


    死锁

    首先,我们得清楚死锁与等待是两回事。等待是当前进程所需要的资源让另一个进程排它了,只要另外一个进程释放,当时进程就可以继续执行(当然如果另外这个进程已经死锁那会进入无限期等待,但是这种情况一般不会发生,因为SQLSERVER会干预死锁的。另外我们还有一个锁定超时设置 ,这方面大家可以看联机丛书)。而死锁是发生在两个进程间,在没有人为干预两个锁定的进程是都无法继续工作的一种困境。另外一个显著的地方就是死锁一旦发生,SQLSERVER就会干预进来,我们所能感知比如接收到1205号错误,健壮的应用系统会人工干预1205错误,恰当的重新提交批处理,当1205错误发生没有终止的进程获得相应的资源并处理自己的事务直至释放资源,其实这种人为的干预潜在的又为死锁提供一个外在环境。当然我们前面写的一个过程也可以查询到相应的锁定信息。

    接着,死锁是无法完全避免的。在一个并发的多用户系统,锁定、线程、内存、并行查询、MARS中死锁的发生是正常的、可以预见的,也是必然的。在我们能力范围内只能尽可能的在应用端或服务器上恰当的处理死锁,使得这种无法完全避免的事件给系统带来的影响降到最低。也就是我们应该明白:死锁是无法完全避免,但是我可以降低发生的次数。

    ......
    ......
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/happyflystone/archive/2009/10/26/4728234.aspx


    More: blog.csdn.net/happyflystone
    2009年11月1日 5:02
  • 查询默认会对表加共享锁,避免脏读。如果在查询的同时,查询的表在被更新,那么查询就会一直等待更新完成后才能返回。

    如果容许脏读,那么可以使用with nolock 关键字,例如:

    select * from tablename with(nolock)

    这个就不会出现死锁了。
    family as water
    • 已标记为答案 SQL STUDIO 2009年11月1日 13:15
    2009年11月1日 6:55