请问大家:我现在用 多线程同时更新(update)同一个数据表,但不同数据(不同记录),数据库会发生死锁吗?(目前我的程序已经发生死锁了)如果发生,这个死锁是在“行级别”还是在“表级别”?(我没有更改数据库的隔离级别。)我用的数据库是 MS SQL Server 2005。对以上实际问题的经过判断后,再次请教大家:我查资料看到,MS SQL Server 2005 死锁默认是“行级别”,update也是在“行级别”发生死锁,我就搞不明白,我多线程同时更新(update)同一个数据表,但不同记录,既然是“不同记录”,而且update的锁是发生在“行级别”,怎么就会产生死锁?

解决方案 »

  1.   

    两个事务:
    begin
    update a set col1='xx'
    waitfor delay '0:05'
    update b set col2='xx'
    endbegin
    update a set col2='xx'
    waitfor delay '0:05'
    update b set col1='xx'
    end这样就会死锁 你说这个是不是行级??已经具体到某行了
      

  2.   

    还是不明白,到底是怎样产生的死锁。【多线程同时更新(update)同一个数据表,但不同记录。】update的锁是发生在“行级别”,又更新的是不同记录,怎么就会产生死锁呢?
      

  3.   

    楼主 是否可以把实际的表结构和UPDATE语句简单描述一下。。UPDATE的锁 是否行级别 要看 WHERE条件 以及 筛选出来的结果记录数。在记录数多的时候会发现锁升级WHERE条件中非聚集索引的查询和扫描也会引发另 如果要真实的看到锁是如何产生的。建议开启PROFILE 看看 锁都加在哪上面了
    锁是个很细的东西,需要耐心分析
      

  4.   

    怎么说好呢?举个例子吧:
     连线1拥有A的锁,此时想update C
     连线2拥有C的锁,此时想update A
    此时就无限期的互相等待了,所以叫死锁.问题的关键是,连线已经拥有的锁,例如
     连线1想update C
     连线2想update A
    那是没问题的,何来死锁!