共用方式為


資料指標並行 (Database Engine)

Microsoft SQL Server 支援伺服器資料指標的四種並行選項:

  • READ_ONLY

  • OPTIMISTIC WITH VALUES

  • OPTIMISTIC WITH ROW VERSIONING

  • SCROLL LOCKS

  • READ_ONLY
    不允許透過資料指標進行定位更新,且構成結果集之資料列中不保留鎖定。

  • OPTIMISTIC WITH VALUES
    開放式並行控制是交易控制理論的標準之一。開放式並行控制使用的情況為:資料指標開啟和資料列更新期間,其他使用者或處理序更新資料列的可能性極小。以此選項開啟資料指標時,基本資料列中並無保留鎖定,藉此將產能提至最高。若此時使用者企圖修改資料列,系統會將資料列中的目前數值與最近一次擷取資料列所擷取的數值做比較。一旦發現數值變動,伺服器就會知道有其他使用者或處理序更新資料列並傳回錯誤。如果比對數值相同,伺服器就執行修改作業。

    選取此並行選項可強制使用者或程式設計人員接受處理偶發錯誤的責任,該錯誤會指出其他使用者已修改資料列。應用程式接收此錯誤所採取的典型動作是重新整理資料指標、取得新值,然後讓使用者決定是否要修改成新值。在 SQL Server 6.5 或更舊的版本中,text、ntext 和 image 資料行不用於並行比較。

  • OPTIMISTIC WITH ROW VERSIONING
    此開放式並行控制選項是以資料列的版本控制為基礎。若有資料列版本控制,基本資料表必須具有某種類型的版本識別碼,可供伺服器用來判斷將資料列讀入資料指標後是否已變更資料列。在 SQL Server 中,該項功能是由 timestamp 資料類型提供,此類型是表示資料庫中修改作業之相對順序的二進位數值。每個資料庫都有一個全域的目前時間戳記值 **@@**DBTS。每次以任何方式修改了具有 timestamp 資料行的資料列,SQL Server 會將目前的 **@@**DBTS 值儲存在 timestamp 資料行,然後累加 **@@**DBTS。如果資料表有 timestamp 資料行,則時間戳記會被降到資料列層級。然後伺服器就可以比較有時間戳記值之資料列目前的時間戳記值和上次提取資料列時所記錄的時間戳記值,以判斷資料列是否已更新。伺服器不需比較所有資料行的值,僅需比較 timestamp 資料行的值。如果應用程式要求沒有 timestamp 資料行的資料表上有資料列版本控制的開放式並行,資料指標預設為以值為基礎的開放式並行控制。

    [!附註]

    若資料指標對遠端資料來源開放,當遠端來源不包含時間戳記資料行時,不支援透過資料指標更新。

  • SCROLL LOCKS
    此選項實作封閉式並行控制,也就是應用程式在基本資料庫資料列被讀入資料指標結果集的同時,將這些資料列鎖定。使用伺服器資料指標時,資料列被讀入資料指標的同時,資料列上也附加了更新鎖定。如果資料指標是在交易中開啟,交易更新的鎖定會保留到交易確認或取消為止;資料指標鎖定會在擷取下一個資料列後才卸除。如果資料指標是在交易外開啟,鎖定會於擷取下一個資料列時卸除。因此在交易中,應該要開啟資料指標,無論使用者何時需要完整的封閉式並行控制。更新鎖定會避免其他作業取得更新或獨佔鎖定,以免其他作業更新資料列。但更新鎖定本身不會封鎖共用鎖定,故無法阻止其他作業讀取資料列,除非第二個作業也以更新鎖定要求讀取才會阻止。

捲動鎖定

根據資料指標定義中 SELECT 陳述式指定的鎖定提示,這些資料指標並行選項可能會產生捲動鎖定。捲動鎖定取自於擷取中的每一個資料列,並保留至下一個擷取或關閉資料指標時才消失,視哪一個先出現而定。於下一個擷取時,伺服器會自新擷取取得資料列的捲動鎖定,並釋放前一個擷取的資料列捲動鎖定。捲動鎖定與交易鎖定無關,且可能歷經認可或回復作業仍然保存。如果將認可時關閉資料指標的選項設定為關閉,COMMIT 並不會關閉任何開啟的資料指標,且捲動鎖定會歷經認可作業仍然保存,以繼續隔離擷取資料。

所需的捲動鎖定類型視資料指標並行選項,以及資料指標 SELECT 陳述式的鎖定提示而定。

[!附註]

僅索引鍵集衍生資料指標與動態資料指標支援捲動鎖定。

鎖定提示

Read only

Optimistic with values

Optimistic with row versioning

鎖定

無提示

-

-

-

更新

NOLOCK*

-

-

-

-

HOLDLOCK

-

-

-

更新

UPDLOCK

-

-

-

更新

TABLOCKX

-

-

-

更新

其他全部

-

-

-

更新

*指定 NOLOCK 提示會使得資料表成為透過資料指標指定唯讀的資料表。

指定資料指標並行選項

指定的並行選項依每個資料指標環境而不同:

  • Transact-SQL 資料指標

    在 DECLARE CUROSR 陳述式指定 READ_ONLY、SCROLL_LOCK 和 OPTIMISTIC 關鍵字。OPTIMISTIC 關鍵字指定 optimistic with row versioning,Transact-SQL 資料指標不支援 optimistic with values concurrency 選項。

  • ADO 應用程式

    Recordset 物件的 LockType 屬性中,指定 adLockReadOnlyadLockPessimisticadLockOptimisticadLockBatchOptimistic

  • ODBC 應用程式

    將陳述式屬性 SQL_ATTR_CONCURRENCY 設定為 SQL_CONCUR_READ_ONLY、SQL_CONCUR_ROWVER、SQL_CONCUR_VALUES 或 SQL_CONCUR_LOCK。