資料指標鎖定

在 SQL Server 中,資料指標定義中的 SELECT 陳述式,受限於其他 SELECT 陳述式適用的相同交易鎖定規則。不過,在資料指標中,可以根據資料指標並行層級的規格,來取得其他的捲動鎖定集。

任何由 SELECT 陳述式取得的交易鎖定,包括資料指標定義中的 SELECT 陳述式,由以下方式控制:

  • 針對連接所設定的交易隔離等級。

  • FROM 子句中指定的任何鎖定提示。

這些鎖定會保留至資料指標和獨立 SELECT 陳述式的目前交易結束。SQL Server 於自動認可模式中執行時,每個個別 SQL 陳述式就是一個交易,而且會在陳述式執行完畢時同時釋放鎖定。如果 SQL Server 於外顯或隱含交易模式下執行,鎖定會保留至交易認可或復原為止。

例如,這兩個 Transact-SQL 範例中完成的鎖定基本上沒什麼不同:

/* Example 1 */
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
GO
BEGIN TRANSACTION
GO
SELECT * FROM AdventureWorks2008R2.Sales.Store;
GO

/* Example 2 */
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
GO
BEGIN TRANSACTION
GO
DECLARE abc CURSOR STATIC FOR
SELECT * FROM AdventureWorks2008R2.Sales.Store;
GO
OPEN abc
GO

將交易隔離等級設定為可重覆讀取時,表示範例 1 的獨立 SELECT 陳述式,與範例 2 DECLARE CURSOR 中的 SELECT 陳述式會在其讀取的每個資料列產生共用鎖定,且共用鎖定會保留至交易認可或復原。

取得鎖定

就取得的交易鎖定類型而言,即使資料指標與與獨立 SELECT 陳述式遵從同樣的規則,取得鎖定的時機仍然不同。擷取資料列時,系統必定會取得獨立 SELECT 或資料指標產生的鎖定。對獨立 SELECT 而言,執行陳述式時即擷取所有的資料列。但資料指標則視資料指標的類型判斷擷取資料列的時機:

  • 靜態資料指標會在開啟資料指標的同時擷取整個結果集。這將會在開啟時鎖定結果集的每個資料列。

  • 索引鍵集衍生資料指標會在開啟資料指標的同時擷取結果集每個資料列的索引鍵。這將會在開啟時鎖定結果集的每個資料列。

  • 動態資料指標 (包含一般 Forward-Only 資料指標) 在提取資料列之前不會擷取它們。在提取鎖定後才可以在資料列上取得它們。

  • 依查詢最佳化工具選擇的執行計畫,快速順向 (ForwardOnly) 資料指標取得鎖定的方法也有不同。如果選擇的是動態計畫,資料列被擷取後才能取得鎖定。如果產生工作表,資料列會被讀入工作表並於開啟時鎖定。

資料指標也支援其所屬的並行規格,有些還能在每次擷取時於資料列產生其他額外的鎖定。這些捲動鎖定會保留至發生下一次擷取作業或資料指標關閉時才消失,取決於哪一項作業先發生。如果將「保持在認可時資料指標開啟」的連線選項設定為開啟的狀態,這些鎖定會在認可或復原作業中保留。