KB3168793 - 修正:SQL Server 2016 中當另一個 DDL 交易在相同的資料庫上執行時,無法建立或刪除資料表或索引

Applies To
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 的每個新累積更新都包含所有 Hotfix 和先前累積更新的所有安全性修正程式。 我們建議您下載並安裝 SQL Server 的最新累積更新:

      

更多資訊

當 DDL 建立或刪除資料表或索引時,必須從 sysrowsets 插入或刪除資料表或索引的資料列集識別碼,為此,它必須持有項目上的資料列層級 X 鎖定。 在交易內完成此操作時,X 鎖定將在交易期間保持。

當 Tuple Mover 發現可排清的刪除緩衝區時,必須逐一查看 sysrowset 以探索現有的資料表或索引。 若要從 sysrowset 讀取每一列,他必須持有目前讀取的項目的列層級 S 鎖定。 當 Tuple Mover 找到它可以處理的第一個資料列集時,探索程式會停止。 此時,Tuple Mover 將執行排清刪除緩衝區的實際工作,但為了確保探索到的資料列集仍然有效,它會在探索程式期間評估的所有資料列集上持有 SCH-S 鎖定,直到它完成其工作為止。

Sysrowsets 會依資料列集識別碼排序,因此 Tuple Mover 可能會掃描多個現有的資料列集,其中它沒有任何動作可執行,但仍保留 SCH-S 鎖定,並且到達 sysrowsets 中無法取得資料列層級 S 鎖定的項目,因為它目前正由持有資料列 X 鎖的長時間執行交易變更。 此時,涉及資料列集識別碼變更的 DDL 會封鎖在 Tuple Mover 的 SCH-S 鎖定後面。

狀態

Microsoft 已確認這是「適用對象」一節中列出的 Microsoft 產品中的問題。

參考資料

了解 Microsoft 用來說明軟體更新的術語。