Share via


自訂鎖定逾時

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

ms177413.note(zh-tw,SQL.90).gif附註:
在 SQL Server 2005 中,可使用 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

請參閱

概念

處理應用程式中的錯誤和訊息

其他資源

@@LOCK_TIMEOUT (Transact-SQL)
SET LOCK_TIMEOUT (Transact-SQL)
sp_who (Transact-SQL)
sys.dm_os_waiting_tasks

說明及資訊

取得 SQL Server 2005 協助