此实例承载 SharePoint 2007 数据库 (SP)。针对 SP 内容数据库中一个使用率很高的表,我们遇到了许多 SELECT/INSERT 死锁。我已经缩小了涉及的资源范围,两个进程都需要对非聚集索引进行锁定。
INSERT 需要对 SELECT 资源的 IX 锁,而 SELECT 需要对 INSERT 资源的 S 锁。死锁图描绘了三个资源,1.) 两个来自 SELECT(生产者/消费者并行线程),和 2.) INSERT。
我已附上死锁图供您查看。因为这是 Microsoft 代码和表结构,我们无法进行任何更改。
但是,我在 MSFT SP 站点上读到,他们建议将 MAXDOP 实例级别配置选项设置为 1。由于此实例在许多其他数据库/应用程序之间共享,因此无法禁用此设置。
因此,我决定尝试阻止这些 SELECT 语句并行运行。我知道这不是解决方案,而是帮助进行故障排除的临时修改。因此,我将“并行的成本阈值”从我们的标准 25 增加到 40,即使工作负载没有改变(SELECT/INSERT 频繁发生),死锁也消失了。我的问题是为什么?
SPID 356 INSERT 在属于非聚集索引的页上有 IX 锁
SPID 690 SELECT 执行 ID 0 在属于同一非聚集索引的页上有 S 锁
现在
SPID 356 想要 SPID 690 资源上的 IX 锁,但无法保留它,因为 SPID 356 被 SPID 690 执行 ID 0 S 锁
SPID 690 执行 ID …