調整交易隔離等級

隔離屬性 (Isolaton Property) 為不可部份完成性、一致性、隔離和耐用 (ACID) 之一,為工作的邏輯單元,必須以交易的形式來顯示。它的能力是保護交易免於受到其他並行交易執行更新的影響。隔離等級 (Isolation Level) 事實上可針對每一筆交易來自訂。

SQL Server Database Engine支援以 SQL-92 定義的交易隔離層級。設定交易隔離層級可讓程式設計人員,針對某些增加完整性問題的風險以及支援更大的資料並行存取之間,進行截長補短的取捨。交易隔離等級為:

  • READ UNCOMMITTED

  • READ COMMITTED

  • REPEATABLE READ

  • SNAPSHOT

  • SERIALIZABLE

由於有兩個例外狀況,每個隔離層級擁有更長期間的更具限制之鎖定。當 READ_COMMITTED_SNAPSHOT 設為 ON 時,例外狀況為 SNAPSHOT 以及 READ COMMITTED。這些隔離層級在讀取作業期間並不需要共用鎖定。在資料表層級只有保留 SCH-S 鎖定

交易隔離等級可使用 Transact-SQL 或透過資料庫 API 來設定。

  • Transact-SQL
    Transact-SQL 指令碼使用 SET TRANSACTION ISOLATION LEVEL 陳述式。

  • ADO
    ADO 應用程式將 Connection 物件的 IsolationLevel 屬性設定為 adXactReadUncommitted、adXactReadCommitted、adXactRepeatableRead、或是 adXactReadSerializable。

  • ADO.NET
    使用 System.Data.SqlClient Managed 命名空間的 ADO.NET 應用程式將可呼叫 SqlConnection.BeginTransaction 方法並將 IsolationLevel 選項設定成 Unspecified、Chaos、ReadUncommitted、ReadCommitted、RepeatableRead、Serializable, 以及 Snapshot。

  • OLE DB
    開始交易時,在 isoLevel 設定成 ISOLATIONLEVEL_READUNCOMMITTED、ISOLATIONLEVEL_READCOMMITTED、ISOLATIONLEVEL_REPEATABLEREAD、ISOLATIONLEVEL_SNAPSHOT 或 ISOLATIONLEVEL_SERIALIZABLE 的情況下,使用 OLE DB 的應用程式會呼叫 ITransactionLocal::StartTransaction

    當以自動認可模式指定交易隔離層級時,OLE DB 應用程式可以將 DBPROPSET_SESSION 屬性的 DBPROP_SESS_AUTOCOMMITISOLEVELS 設定成 DBPROPVAL_TI_CHAOS、DBPROPVAL_TI_READUNCOMMITTED、DBPROPVAL_TI_BROWSE、DBPROPVAL_TI_CURSORSTABILITY、DBPROPVAL_TI_READCOMMITTED、DBPROPVAL_TI_REPEATABLEREAD、DBPROPVAL_TI_SERIALIZABLE、DBPROPVAL_TI_ISOLATED 或 DBPROPVAL_TI_SNAPSHOT。

  • ODBC
    在 Attribute 設定為 SQL_ATTR_TXN_ISOLATION 以及 ValuePtr 設定為 SQL_TXN_READ_UNCOMMITTED、SQL_TXN_READ_COMMITTED、SQL_TXN_REPEATABLE_READ,或 SQL_TXN_SERIALIZABLE 的情況下,ODBC 應用程式會呼叫 SQLSetConnectAttr

    至於快照集交易,應用程式呼叫 SQLSetConnectAttr 的 Attribute 會設定為 SQL_COPT_SS_TXN_ISOLATION ,而 ValuePtr 則設定為 SQL_TXN_SS_SNAPSHOT。快照集交易可以使用 SQL_COPT_SS_TXN_ISOLATION 或 SQL_ATTR_TXN_ISOLATION 來擷取。