Applies ToSQL 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 的最新累积更新:

更多信息

当 DDL 创建或删除表或索引时,它需要在 sysrowsets中插入或删除表或索引的行集 id,以便它需要为该条目保留行级别 X 锁。 在事务内完成此操作时,将在事务的持续时间内保留 X 锁。当元组移动器发现 flushable 删除缓冲区时,它需要循环访问 sysrowsets 以发现现有表或索引。 若要从 sysrowsets 中读取每一行,他需要在它当前读取的条目上保留行级 S 锁。 当元组移动器查找它可以执行的第一个行集时,发现过程将停止。 此时,元组移动器将执行刷新删除缓冲区的实际工作,但为了确保所发现的行集仍然有效,它将在发现过程中对其评估的所有行集保留 SCH 锁,直到完成其工作。Sysrowsets 由行集 id 进行排序,因此它可能会导致元组移动器扫描了多个现有的行集,但仍保留了 SCH 的锁定,但它仍将保留到 Sysrowsets 中的一个条目,但它不能获取行级 S 锁,因为它当前由长时间运行的事务(它在行上保留 X 锁)更改。 此时,涉及行集 id 更改的 DDLs 将阻止元组移动器的 SCH 锁。

状态

Microsoft 已确认这是在“适用范围”部分中列出的 Microsoft 产品存在的问题。

参考

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

需要更多帮助?

需要更多选项?

了解订阅权益、浏览培训课程、了解如何保护设备等。