Share via


SET DEADLOCK_PRIORITY (Transact-SQL)

指定如果與另一個工作階段發生死結時,目前工作階段繼續處理的相對重要性。

主題連結圖示Transact-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
    指定如果陷入死結鏈結的其他工作階段,其死結優先權設成 HIGH 或大於 5 的整數,目前工作階段便會成為死結犧牲者,如果另一個工作階段的死結優先權也設成 HIGH 或 5,目前工作階段可以成為死結的犧牲者。

  • <numeric-priority>
    這是一個整數值範圍 (-10 至 10),用來提供 21 個層級的死結優先權。指定如果陷入死結鏈結的其他工作階段在執行較高的死結優先權值,目前工作階段便會成為死結犧牲者,如果其他工作階段所執行的死結優先權值低於目前工作階段的值,目前工作階段便不會成為死結犧牲者。另外,它也指定如果另一個工作階段執行的死結優先權值與目前工作階段相同,目前工作階段可以成為死結的犧牲者。LOW 對應於 -5,NORMAL 對應於 0,HIGH 對應於 5。

  • **@**deadlock_var
    這是指定死結優先權的字元變數。這個變數必須設成 'LOW'、'NORMAL' 或 'HIGH' 值。這個變數必須足以保存整個字串。

  • **@**deadlock_intvar
    這是指定死結優先權的整數變數。這個變數必須設成 (-10 至 10) 範圍內的整數值。

備註

當兩個工作階段都在等待存取對方所鎖定的資源時,便會出現死結。當 SQL Server 執行個體偵測到兩個工作階段發生死結時,它會選擇一個工作階段作為死結犧牲者來解決死結。此時會回復犧牲者目前的交易,且會向用戶端傳回死結錯誤訊息 1205。這個工作階段所持有的鎖定會全部釋出,讓其他工作階段繼續作業。

選擇哪個工作階段作為死結犧牲者,會隨著每個工作階段的死結優先權而不同:

  • 如果兩個工作階段的死結優先權相同,SQL Server 執行個體會選擇回復成本較低的工作階段作為死結的犧牲者。例如,如果兩個工作階段的死結優先權都設成 HIGH,此時執行個體會選擇評估回復成本較低的工作階段來作為犧牲者。

  • 如果工作階段的死結優先權不同,就選擇死結優先權最低的工作階段來作為死結犧牲者。

SET DEADLOCK_PRIORITY 的設定是在執行階段進行設定,而不是在剖析階段進行設定。

權限

需要 public 角色中的成員資格。

範例

下列範例會利用變數,將死結優先權設為 LOW。

DECLARE @deadlock_var NCHAR(3);
SET @deadlock_var = N'LOW';

SET DEADLOCK_PRIORITY @deadlock_var;
GO

下列範例將死結優先權設為 NORMAL。

SET DEADLOCK_PRIORITY NORMAL;
GO