自訂鎖定逾時

如果 MicrosoftSQL Server Database Engine 的執行個體因為另一個交易已擁有資源的衝突鎖定,而無法將鎖定授與給另一個交易時,第一個交易會被封鎖,並等待現有鎖定釋出。依預設,除非嘗試存取資料 (且可能會永遠被封鎖),否則並沒有強制的逾時期限,且無法在鎖定資源之前測試資源是否已經鎖定。

[!附註]

在 SQL Server 中,可使用 sys.dm_os_waiting_tasks 動態管理檢視,判斷處理序是否已封鎖,以及其封鎖者。在舊版 SQL Server 中,請使用 sp_who 系統預存程序。

LOCK_TIMEOUT 設定值可讓應用程式設定陳述式等待封鎖資源的時間上限。當陳述式等待的時間超過 LOCK_TIMEOUT 設定值時,會自動取消封鎖的陳述式,然後將錯誤訊息 1222 (Lock request time-out period exceeded) 傳回應用程式。但 SQL Server 不會回復或取消包含此陳述式的任何交易。因此,應用程式必須具有能捕捉錯誤訊息 1222 的錯誤處理常式。如果應用程式沒有捕捉此錯誤,就會繼續進行而不知道交易中的個別陳述式已取消了,並且因為交易中後面的陳述式可能相依於這個從未執行過的陳述式,此時就會發生錯誤。

實作會捕捉錯誤訊息 1222 的錯誤處理常式,可讓應用程式處理逾時狀況並採取補救措施,例如自動重新送出先前被封鎖的陳述式,或是回復整筆交易。

若要判斷目前的 LOCK_TIMEOUT 設定值,請執行 @@LOCK_TIMEOUT 函數:

SELECT @@lock_timeout;
GO