鎖定提示

在 SELECT、INSERT、UPDATE 以及 DELETE 陳述式中的個別資料表參考可以指定鎖定提示。此提示可指定鎖定的類型或是資料表資料所使用之 SQL Server Database Engine 執行個體的資料列版本設定。需要取得物件的較細緻鎖定類型的控制時可以使用資料表層級的鎖定提示。這些鎖定提示覆寫 (Override) 工作階段目前的交易隔離等級 (Isolation Level)。

如需特定鎖定提示及其行為的詳細資訊,請參閱<資料表提示 (Transact-SQL)>。

[!附註]

Database Engine查詢最佳化工具幾乎永遠都會選擇正確的鎖定層級。建議您只有在必要時才使用資料表層級的鎖定提示來變更預設的鎖定行為。不允許鎖定層級可能會嚴重影響並行。

Database Engine在讀取中繼資料時可能必須取得鎖定,即使在處理具有鎖定提示的選取,而該鎖定是防止讀取資料時要求共用鎖定時也是如此。例如,使用 NOLOCK 提示的 SELECT 在讀取資料時並不會取得共用鎖定,但有時在讀取系統目錄檢視時會要求鎖定。這表示使用 NOLOCK 的 SELECT 陳述式有可能遭到封鎖。

如下列範例所顯示,如果交易隔離等級設定為 SERIALIZABLE,並使用 SELECT 陳述式來指定資料表層級的鎖定提示 NOLOCK,則就不採用通常用來維護序列化交易的索引鍵範圍鎖定。

USE AdventureWorks2008R2;
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
GO
BEGIN TRANSACTION;
GO
SELECT Title
    FROM HumanResources.Employee WITH (NOLOCK);
GO

-- Get information about the locks held by 
-- the transaction.
SELECT  
        resource_type, 
        resource_subtype, 
        request_mode
    FROM sys.dm_tran_locks
    WHERE request_session_id = @@spid;

-- End the transaction.
ROLLBACK;
GO

所採用的鎖定中,唯一參考 HumanResources.Employee 的鎖定為結構描述穩定性 (Sch-S) 鎖定。這種情況下不保證有序列化能力。

在 SQL Server 2008 中,ALTER TABLE 的 LOCK_ESCALATION 選項可能會不喜歡資料表鎖定,並啟用資料分割資料表上的 HoBT 鎖定。這個選項不是鎖定提示,但是可用來減少鎖定擴大。如需詳細資訊,請參閱<ALTER TABLE (Transact-SQL)>。