Sql server 数据库锁定问题
请。我们在一个最近流量大幅增加的生产数据库上获得了大量的锁。我们使用iDeaBrade进行大多数数据访问 我使用Sql Profiler获得了以下跟踪: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
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,但此跟踪似乎表明:
mode=“RangeS-U”
射程锁?停止使用高事务隔离级别。坚持阅读承诺。如果您使用CLR TransactionScope对象,请让他们使用读取提交隔离(默认情况下,他们使用Seralizable,恶心)。尝试在数据库上启用读提交快照隔离。请参阅。首先要注意的几件事:
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对此进行标记。我已经完成了更新。斯卡夫曼,谢谢你的编辑。。。