現象
次のような状況で問題が発生します。
-
ALLOW_SNAPSHOT_ISOLATIONとREAD_COMMITTED_SNAPSHOTのオプションが有効になっている Microsoft SQL Server 2012 データベースがある。
-
同じテーブルに対して少なくとも3つの同時クエリを実行している。
-
クエリでは、 (TABLOCK, UPDLOCK) クエリヒントが使用されます。
-
各クエリは、明示的な BEGIN TRAN ステートメントでラップされますが、 COMMIT TRAN ステートメント は実行されません。
最初のクエリがこのシナリオでコミットされると、他のクエリの1つがデッドロックされます。 READ_COMMITTED_SNAPSHOT が TABLOCK と UPDLOCK のクエリヒントと共に有効になっている場合、セッションでは、テーブルに対して IX ロックがかかります。 デッドロックは、2つの同時セッションで IX ロックを同時に X ロックに変換しようとしたときに発生します。 READ_COMMITTED_SNAPSHOTが無効になっている場合、X ロックに変換されたときにデッドロックが発生しない6つのロックがセッションによって取得されます。 この問題を解決するには、 READ_COMMITTED_SNAPSHOT が TABLOCK と UPDLOCK のヒントと共に使用されるときに、IX ロックの代わりに LCK_M_SCH_S ロックを付与します。注:この問題は、Microsoft SQL Server 2008 R2 でも発生します。 SQL Server 2008 R2 の修正プログラムはまもなくリリースされます。
解決方法
この問題は、SQL Server の次の累積的な更新プログラムで最初に修正されました。
SQL Server 2012 SP1 の累積更新プログラム8 /en-us/help/2917531
SQL Server 用の新しい累積更新プログラムには、以前の累積的な更新プログラムに含まれていたすべての修正プログラムとすべてのセキュリティ修正が含まれています。 SQL Server の最新の累積的な更新プログラムを確認します。
状態
マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。