【发布时间】:2012-09-25 08:19:34
【问题描述】:
我正在尝试使用 SQL Server Profiler 确定死锁的原因。
这是死锁图:
两个语句都是插入,后跟select scope_identity();
实际上,有 2 个并发进程在一个循环中重复执行 insert-select_identity。
我希望 insert 对 聚集索引 采取排他锁,而 select 对 non -clustered index,然后他们互相等待释放各自的indeces。
我看到的是两个进程都在等待相同的资源被释放——聚集索引。怎么会这样?特定的追索权应该属于一个过程或另一个过程。我在这里想念什么? 提前感谢大家。
已编辑:是的,隔离级别是可序列化的。
PS:可能我对非聚集索引上的共享锁的假设是错误的,因为我的选择不包含where 语句
编辑2: 这是xml的一部分:
<resource-list>
<keylock hobtid="72057594148028416" dbid="29" objectname="<confidential>" indexname="PK_WP_Inbound_StockTransactionLine" id="lock9641700" mode="RangeS-S" associatedObjectId="72057594148028416">
<owner-list>
<owner id="process8e09288" mode="RangeS-S"/>
</owner-list>
<waiter-list>
<waiter id="process991ce08" mode="RangeI-N" requestType="convert"/>
</waiter-list>
</keylock>
<keylock hobtid="72057594148028416" dbid="29" objectname="<confidential>" indexname="PK_WP_Inbound_StockTransactionLine" id="lock9641700" mode="RangeS-S" associatedObjectId="72057594148028416">
<owner-list>
<owner id="process991ce08" mode="RangeS-S"/>
</owner-list>
<waiter-list>
<waiter id="process8e09288" mode="RangeI-N" requestType="convert"/>
</waiter-list>
</keylock>
</resource-list>
据此,我认为这是由 SERIALIZABLE 隔离引起的范围扫描(谷歌搜索)。但是,我仍然不明白这是怎么发生的以及推荐的补救措施是什么。
【问题讨论】:
-
您使用的是什么隔离级别?可序列化?如果是这样,有什么理由吗?
-
是的,我忘了说,对不起。我已经编辑了帖子
-
发布死锁 XML,而不是图像。图片不完整、具有误导性且经常出错。
-
您肯定在处理聚集索引上的不同行。发布完整的 XML。
标签: sql-server indexing deadlock sql-server-profiler