SET DEADLOCK_PRIORITY (Transact-SQL)
適用対象: Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics (サーバーレス SQL プールのみ)
別のセッションとデッドロックとなる場合、現在のセッションでの処理の継続の相対的な優先度を指定します。
構文
SET DEADLOCK_PRIORITY { LOW | NORMAL | HIGH | <numeric-priority> | @deadlock_var | @deadlock_intvar }
<numeric-priority> ::= { -10 | -9 | -8 | ... | 0 | ... | 8 | 9 | 10 }
引数
LOW
現在のセッションがデッドロックに含まれ、そのデッドロック チェーンに含まれる他のセッションのデッドロックの優先度が NORMAL または HIGH または -5 を超える整数値のいずれかである場合、現在のセッションがデッドロックの対象になることが指定されます。 他のセッションのデッドロックの優先度の設定が -5 未満の整数値である場合、現在のセッションはデッドロックの対象とはなりません。 また、別のセッションのデッドロックの優先度が LOW または -5 と等しい整数値に設定されている場合、現在のセッションがデッドロックの対象になることが指定されます。
NORMAL
デッドロック チェーンに含まれる他のセッションが、デッドロック優先度を HIGH または 0 より大きい整数値に設定している場合、現在のセッションがデッドロックの対象になります。ただし、他のセッションがデッドロックの優先度を LOW または 0 より小さい整数値に設定している場合は、現在のセッションはデッドロックの対象にはなりません。 また、別の他のセッションのデッドロックの優先度が NORMAL または 0 と等しい整数値に設定されている場合、現在のセッションがデッドロックの対象になることが指定されます。 既定の優先度は NORMAL です。
HIGH
デッドロック チェーンに含まれる他のセッションのデッドロックの優先度が 5 よりも大きい整数値に設定されている場合、現在のセッションがデッドロックの対象になることが指定されます。または別のセッションでもデッドロックの優先度が HIGH または 5 と等しい整数値である場合、現在のセッションはデッドロックの対象となります。
<numeric-priority>
-10 ~ 10 の範囲の整数値です。デッドロックの優先度を 21 段階のレベルで示します。 デッドロック チェーンに含まれる他のセッションが、高いデッドロック優先度値で実行中の場合、現在のセッションはデッドロックの対象になりますが、他のセッションが現在のセッションの値より低いデッドロック優先度値で実行中の場合は、現在のセッションはデッドロックの対象にはなりません。 また、別のセッションの実行のデッドロックの優先度の値が現在のセッションと同じである場合、現在のセッションがデッドロックの対象になることが指定されます。 LOW は -5 に、NORMAL は 0 に、HIGH は 5 にマップされます。
@deadlock_var
デッドロックの優先度を表す文字変数を指定します。 変数は、'LOW'、'NORMAL' または 'HIGH' の値に設定する必要があります。 変数は文字列全体を十分格納できるサイズであることが必要です。
@deadlock_intvar
デッドロックの優先度を表す整数変数を指定します。 変数は -10 ~ 10 の範囲の整数値に設定する必要があります。
解説
デッドロックは、2 つのセッションが両方とも、一方のセッションによりロックされているリソースへのアクセスを待機しているときに発生します。 SQL Server のインスタンスにより、2 つのセッションがデッドロックされていることが検出されると、セッションの 1 つをデッドロックの対象として選択することにより、デッドロックが解決します。 デッドロック対象セッションの現在のトランザクションがロールバックされて、デッドロック エラー メッセージ 1205 がクライアントに返されます。 これによって、そのセッションが保持しているすべてのロックが解放され、他のセッションを続行できるようになります。
どのセッションがデッドロックの対象となるかは、各セッションのデッドロックの優先度によります。
両方のセッションが同じデッドロック優先度の場合、SQL Server のインスタンスは、デッドロック対象としてロールバックするのに負担がかからない方のセッションを選択します。 たとえば、両セッションのデッドロックの優先度が HIGH に設定されている場合、インスタンスはロールバックに最もコストがかからないと予測するセッションを対象に選択します。 コストは、各トランザクションでその時点に書き込まれたログのバイト数を比較することによって決定されます。 (この値はデッドロック グラフの "使用されたログ" として参照できます)。
セッションのデッドロックの優先度が異なる場合、優先度の最も低いセッションがデッドロックの対象として選択されます。
SET DEADLOCK_PRIORITY は、解析時ではなく実行時に設定されます。
この構文は、Azure Synapse Analytics の専用 SQL プールではサポートされていません。 これは、Azure Synapse Analytics のサーバーレス SQL プールではサポートされています。
アクセス許可
ロール public のメンバーシップが必要です。
例
次の例では、デッドロック優先度を LOW
に設定する変数を使用します。
DECLARE @deadlock_var NCHAR(3);
SET @deadlock_var = N'LOW';
SET DEADLOCK_PRIORITY @deadlock_var;
GO
次の例では、デッドロック優先度を NORMAL
に設定します。
SET DEADLOCK_PRIORITY NORMAL;
GO