KB3168793 - 修复:当另一个 DDL 事务在 2016 SQL Server 的同一个数据库上运行时,无法创建或删除表或索引

应用对象
SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use)

症状

在 SQL Server 2016 中执行 DDL 操作(如创建索引或截断表)时,如果同一数据库上运行另一个 DDL 事务,则可能会阻止这些操作。

解决方法

此问题首先在以下SQL Server累积更新中得到解决:

建议:为SQL Server安装最新的累积更新

SQL Server的每个新累积更新都包含以前的累积更新中包含的所有修补程序和所有安全修补程序。 建议下载并安装SQL Server的最新累积更新:

      

详细信息

当 DDL 创建或删除表或索引时,它需要从 sysrowset 中插入或删除表或索引的行集 ID,为此,它需要在条目上保留行级 X 锁。 在事务中执行此操作时,X 锁将在事务的持续时间内保留。

当元组移动器发现可刷新删除缓冲区时,它需要循环访问 sysrowset 以发现现有表或索引。 若要从 sysrowset 中读取每一行,他需要在当前读取的条目上保留一个行级别 S 锁。 当元组移动器找到它可以执行工作的第一个行集时,发现过程将停止。 此时,元组移动器将执行刷新删除缓冲区的实际工作,但为了确保发现的行集仍然有效,它将在发现过程中计算的所有行集上保留一个 SCH-S 锁,直到它完成工作。

Sysrowsets 按行集 ID 排序,因此,元组 Mover 可能扫描了多个现有行集,这些行集没有对其执行任何操作,但仍会持有 SCH-S 锁,并且会到达 sysrowset 中无法获取行级别 S 锁的条目,因为当前该行由长期运行的事务更改该行。 此时,涉及行集 ID 更改的 DDL 在元组移动器的 SCH-S 锁后面被阻止。

状态

Microsoft 已确认在 "适用于" 部分中所列的 Microsoft 产品中存在问题。

参考资料

了解 Microsoft 用于描述软件更新的术语