KB3168793 - FIX: SQL Server 2016 で同じデータベースで別の DDL トランザクションが実行されている場合、テーブルまたはインデックスを作成または削除できません

適用先
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)

現象

2016 年SQL Serverにインデックスの作成やテーブルの切り捨てなどの DDL 操作を実行すると、同じデータベースで別の DDL トランザクションが実行されている場合、操作がブロックされる可能性があります。

解決策

この問題は、SQL Serverの次の累積的な更新プログラムで最初に修正されました。

推奨事項: SQL Serverの最新の累積的な更新プログラムをインストールする

SQL Serverの各新しい累積的な更新プログラムには、すべての修正プログラムと、以前の累積的な更新プログラムに含まれていたすべてのセキュリティ修正プログラムが含まれています。 SQL Serverの最新の累積的な更新プログラムをダウンロードしてインストールすることをお勧めします。

      

追加情報

DDL でテーブルまたはインデックスを作成または削除する場合は、テーブルまたはインデックスの行セット ID を sysrowsets から挿入または削除する必要があります。この ID は、エントリに対して行レベル X ロックを保持する必要があります。 これがトランザクション内で行われると、トランザクションの間、X ロックが保持されます。

Tuple Mover がフラッシュ可能な削除バッファーを検出する場合は、sysrowsets を反復処理して既存のテーブルまたはインデックスを検出する必要があります。 sysrowsets から各行を読み取るために、現在読み取っているエントリに対して行レベル S ロックを保持する必要があります。 検出プロセスは、Tuple Mover が最初に実行できる行セットを検出すると停止します。 この時点で Tuple Mover は削除バッファーをフラッシュする実際の作業を行いますが、検出された行セットがまだ有効であることを確認するために、検出プロセス中に評価されたすべての行セットに SCH-S ロックが保持され、作業が完了するまで保持されます。

Sysrowsets は行セット ID によって並べ替えられるので、Tuple Mover は操作を行わない複数の既存の行セットをスキャンしたが、SCH-S ロックを保持し、行レベル S ロックを取得できない sysrowsets のエントリに到着する可能性があります。これは、現在、行の X ロックを保持する長時間実行トランザクションによって変更されているためです。 この時点で、行セット ID の変更に関連する DD は、タプル ムーバーの SCH-S ロックの背後でブロックされます。

状態

Microsoft は、これが "適用対象" セクションに記載されている Microsoft 製品の問題であることを確認しました。

参考資料

マイクロソフトでソフトウェア更新プログラムの説明に使用する用語集を参照してください。