Sql server 数据库锁定问题

Sql server 数据库锁定问题,sql-server,database,locking,devforce,Sql Server,Database,Locking,Devforce,请。我们在一个最近流量大幅增加的生产数据库上获得了大量的锁。我们使用iDeaBrade进行大多数数据访问 我使用Sql Profiler获得了以下跟踪: deadlock victim="process84af28" resource-list keylock hobtid="72057594096451584" dbid="6" objectname="cpc_db.dbo.Prefix_ChildTableName" indexname="PK_Prefix_ChildTable

请。我们在一个最近流量大幅增加的生产数据库上获得了大量的锁。我们使用iDeaBrade进行大多数数据访问

我使用Sql Profiler获得了以下跟踪:

deadlock victim="process84af28"
  resource-list
    keylock hobtid="72057594096451584" dbid="6" objectname="cpc_db.dbo.Prefix_ChildTableName" indexname="PK_Prefix_ChildTableName" id="lock45982ac0" mode="X" associatedObjectId="72057594096451584"
      owner-list
owner id="processb852e8" mode="X" 
   owner-list
   waiter-list
    waiter id="process84af28" mode="S" requestType="wait" 
    waiter id="processb855b8" mode="RangeS-U" requestType="wait" 
   waiter-list
  keylock
  keylock hobtid="72057594096451584" dbid="6" objectname="cpc_db.dbo.Prefix_ChildTableName" indexname="PK_Prefix_ChildTableName" id="lock513c3bc0" mode="RangeS-U" associatedObjectId="72057594096451584"
   owner-list
    owner id="processb855b8" mode="RangeS-U" 
   owner-list
   waiter-list
    waiter id="processb852e8" mode="RangeS-U" requestType="wait" 
   waiter-list
  keylock
 resource-list
deadlock
有人吗

我不是DBA,但此跟踪似乎表明:

  • 子表中某行上具有独占锁X的进程正在尝试获取同一资源上的Select Update锁(似乎没有意义)

  • 另一个具有选择更新锁的进程仍在尝试获取选择更新锁

  • 有人吗

    我们如何最大限度地减少或消除死锁

    mode=“RangeS-U”


    射程锁?停止使用高事务隔离级别。坚持阅读承诺。如果您使用CLR TransactionScope对象,请让他们使用读取提交隔离(默认情况下,他们使用Seralizable,恶心)。尝试在数据库上启用读提交快照隔离。请参阅。

    首先要注意的几件事:

  • 您使用的是最严格的悲观锁定形式。很可能,您不需要这样做(我们知道您使用的是可序列化事务,因为密钥锁仅适用于此隔离级别)。正如Remus在上面提到的,您肯定应该在这里寻找其他最有可能的选择

  • 上面的输出似乎被截断了一点,您应该有一个名为processlist的部分,其中包含将流程信息映射到spid和查询的信息

  • 从上面的输出中可以看出:

    processb852e8 owns an exclusive lock on index "cpc_db.dbo.Prefix_ChildTableName.PK_Prefix_ChildTableName"
        process84af28 is waiting for a shared KEY lock
        processb855b8 is also waiting for a Shared Range-Update KEY lock
    
    processb855b8 owns Shared Range-Update lock on index "cpc_db.dbo.Prefix_ChildTableName.PK_Prefix_ChildTableName" (the same index)
        processb852e8 is waiting on a Shared Range-Update KEY lock
    
    独占锁是某种写入(即更新、删除、插入),RangeS-U锁可能是更新,但如果不看到映射的信息,就无法判断


    巴特·邓肯(Bart Duncan)有几篇关于解密跟踪输出的好文章,如果你有,请参阅和。您还可以看到并发和脚本的概述。

    罪魁祸首似乎是:-

    owner id="processb855b8" mode="RangeS-U"
    
    这似乎锁定了一组行。 它正在等待一行被process84af28重新分配, 它正在等待由进程B852E8重新释放一行 它正在等待第一个进程释放一行

    SQLServer通过在中间杀死进程,允许其他两个完成,解决死锁。 您应该查看您的隔离级别。最佳做法是使用最低的 “选择”多行时可用的锁定级别。 如果您很可能要更新当前事务中的行,则仅在“select”ed行上使用更高级别


    而且,在等待外部服务或用户操作时,永远不要将行锁定。

    我自己也曾在不同的产品(不是iDeaBrade)中看到过这种死锁问题。根据我的经验,这不是一个数据库问题;这可能是软件与数据库通信的问题

    我的问题是与数据库通信的组件的配置

    第一次,COM+默认为SERIALIZABLE,并且必须配置为默认为READ COMMITTED

    第二次,COM+到.NET互操作条件导致数据库连接默认为可序列化


    对我们来说,一个快速而肮脏的解决方案是在SQL命令前面加上“SET TRANSACTION ISOLATION LEVEL READ COMMITTED”以覆盖SERIALIZABLE,直到核心问题得到解决。

    这是什么数据库服务器?您应该将其添加到标记中,这样知道如何解释该跟踪的人将能够找到它。您应该使用您正在使用的数据库软件Tanks Greg对此进行标记。我已经完成了更新。斯卡夫曼,谢谢你的编辑。。。