Настройка уровня изоляции транзакции

READ COMMITTED является уровнем изоляции по умолчанию для компонента MicrosoftSQL Server Database Engine. Если приложение должно работать с другим уровнем изоляции, оно может использовать следующие методы для установки уровня изоляции.

  • Выполнить инструкцию SET TRANSACTION ISOLATION LEVEL.

  • Приложения ADO.NET, использующие управляемое пространство имен System.Data.SqlClient, могут указать параметр IsolationLevel при помощи метода SqlConnection.BeginTransaction.

  • Приложения, использующие ADO, могут установить свойство Autocommit Isolation Levels.

  • При запуске транзакции приложения, использующие OLE DB, могут вызвать метод ITransactionLocal::StartTransaction с параметром isoLevel, равным необходимому уровню изоляции транзакции. При указании уровня изоляции в режиме автоматической фиксации приложения, использующие OLE DB, могут установить свойство DBPROP_SESS_AUTOCOMMITISOLEVELS в значение, равное необходимому уровню изоляции транзакции.

  • Приложения, использующие ODBC, могут установить атрибут SQL_COPT_SS_TXN_ISOLATION при помощи функции SQLSetConnectAttr.

Дополнительные сведения об установке уровней изоляции транзакций см. в разделе Настройка уровней изоляции транзакций.

Если уровень изоляции указан, поведение блокировки для всех запросов и инструкций языка DML в сеансе SQL Server действует на указанном уровне изоляции. Уровень изоляции действует до тех пор, пока сеанс не будет прерван или не будет установлен другой уровень изоляции.

В следующем примере устанавливается уровень изоляции SERIALIZABLE:

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

При необходимости уровень изоляции может быть изменен для отдельного запроса или инструкции DML с помощью указания подсказки уровня таблицы. Указание подсказки уровня таблицы не влияет на остальные инструкции сеанса. Подсказки уровня таблицы для изменения поведения по умолчанию рекомендуется использовать только в случае крайней необходимости.

Компоненту Database Engine может потребоваться применить блокировки при чтении метаданных, даже если уровень изоляции установлен в значение, при котором не запрашиваются общие блокировки при чтении данных. Например, транзакция, выполняемая на уровне изоляции READ UNCOMMITTED, не применяет общих блокировок при чтении данных, но иногда может запросить блокировки при чтении системного представления каталога. Это значит, что транзакция READ UNCOMMITTED, возможно, вызовет блокировку при выполнении запроса к таблице, в то время как параллельная транзакция изменяет метаданные этой таблицы.

Чтобы узнать, какой уровень изоляции транзакции установлен в данный момент, используйте инструкцию 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.