共用方式為


自訂交易隔離等級

READ COMMITTED 是 MicrosoftSQL Server Database Engine 的預設隔離等級。如果應用程式必須在不同隔離等級操作,可以使用下列方法來設定隔離等級:

  • 執行 SET TRANSACTION ISOLATION LEVEL 陳述式。

  • 如果 ADO.NET 應用程式使用 System.Data.SqlClient Managed 命名空間,則可以使用 SqlConnection.BeginTransaction 方法來指定 IsolationLevel 選項。

  • 使用 ADO 的應用程式可以設定**「自動認可隔離等級」**屬性。

  • 當啟動交易時,使用 OLE DB 的應用程式可以將 isoLevel 設為所要的交易隔離等級,以呼叫 ITransactionLocal::StartTransaction。當在自動認可模式中指定隔離等級時,使用 OLE DB 的應用程式可以將 DBPROPSET_SESSION 屬性 DBPROP_SESS_AUTOCOMMITISOLEVELS 設為所要的交易隔離等級。

  • 使用 ODBC 的應用程式可以使用 SQLSetConnectAttr 來設定 SQL_COPT_SS_TXN_ISOLATION 屬性。

如需有關設定交易隔離等級的詳細資訊,請參閱<調整交易隔離等級>。

已指定隔離等級時,在 SQL Server 工作階段中,所有查詢和資料操作語言 (DML) 陳述式的鎖定行為都會在此隔離等級運作。此隔離等級會維持有效,直到工作階段結束或隔離等級設為另一個等級為止。

下列範例會設定 SERIALIZABLE 隔離等級:

USE AdventureWorks
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
GO
BEGIN TRANSACTION;
SELECT EmployeeID
    FROM HumanResources.Employee;
GO

如果有必要,藉由指定資料表層級的提示,可以覆寫個別查詢或 DML 陳述式的隔離等級。指定資料表層級的提示不會影響到工作階段的其他陳述式。建議您只有在絕對必要時,才使用資料表層級的提示來變更預設的行為。

Database Engine 讀取中繼資料時可能必須取得鎖定,即使隔離等級設為讀取資料時不要求共用鎖定。例如,在讀取未認可之隔離等級執行的交易,讀取資料時不會取得共用鎖定,但在讀取系統目錄檢視時,有時可能會要求鎖定。這表示,當並行交易正在修改資料表的中繼資料,而讀取未認可的交易同時查詢此資料表時,可能會造成鎖定。

若要判斷目前設定的交易隔離等級,可使用下例所示的 DBCC USEROPTIONS 陳述式。結果集和您系統上的結果集可能不盡相同。

USE AdventureWorks;
GO
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
GO
DBCC USEROPTIONS;
GO

以下為結果集:

Set Option                   Value                                       
---------------------------- ------------------------------------------- 
textsize                     2147483647
language                     us_english
dateformat                   mdy
datefirst                    7
...                          ...
Isolation level              repeatable read

(14 row(s) affected)

DBCC execution completed. If DBCC printed error messages, contact your system administrator.