症状
假设您在 Microsoft SQL Server 2012 或 Microsoft SQL Server 2014 中使用合并复制。 作为同步过程的一部分,合并代理会在会话中生成新的一代。 如果由于某种原因(例如死锁或超时),生成创建事务被选为死锁受害者,并且事务被回滚,则在即将到来的生成过程中可能会存在MSinternal_makegeneration_inprog应用程序锁的大型阻塞链,并且前面提到的会话将显示为头阻止程序。
原因
用于帮助保护生成制作过程的应用程序锁是会话级应用程序锁。 当在生成过程中检测到死锁时,仅回滚事务,但不会注销会话。 若要释放会话级别应用程序锁,会话必须注销。 因此,由于重试逻辑的设计 (会话在生成过程中不会注销合并复制失败) ,如果第一代会话失败且死锁,则在事务回滚过程中不会释放会话 (MSinternal_makegeneration_inprog) 。 这会导致在即将生成过程中阻塞锁请求链。 头部阻止程序显示为第一代发出请求,但因死锁而失败。
在修补程序之前,SQL Server 只为成功的生成过程清除锁定。 如果发生死锁,它会在会话注销之前留下孤立的会话应用程序锁。
解决方法
此问题已首先在 SQL Server 的以下累积更新中修复。
SQL Server 2014 累积更新 5 /en-us/help/3011055
SQL Server 2012 SP2 累积更新 3 /en-us/help/3002049
关于 SQL Server 的累积更新
SQL Server 的每个新累积更新都包含上一个累积更新中包含的所有修补程序和所有安全修补程序。 查看 SQL Server 的最新累积更新:
状态
Microsoft 已确认在 "适用于" 部分中所列的 Microsoft 产品中存在问题。