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

Изоляция является одним из четырех свойств транзакции (атомарности, согласованности, изоляции и устойчивости (ACID)), которые должны быть присущи логической единице работы, чтобы ее можно было называть транзакцией. Это свойство дает возможность защитить транзакции от последствий обновлений, осуществляемых другими параллельно выполняемыми транзакциями. Уровень изоляции возможно отрегулировать для каждой транзакции.

В SQL Server Database Engine поддерживаются уровни изоляции транзакций, определенные в SQL-92. Настройка уровней изоляции транзакций позволяет разработчикам добиваться большей доступности данных для параллельного обращения к ним в обмен на увеличение риска определенных проблем с целостностью данных. Уровнями изоляции транзакций являются:

  • READ UNCOMMITTED

  • READ COMMITTED

  • REPEATABLE READ

  • SNAPSHOT

  • SERIALIZABLE

С двумя исключениями, каждый уровень изоляции транзакций предлагает более высокую степень изоляции, чем предыдущий уровень, обеспечивая более строгие блокировки на более продолжительные сроки. Этими исключениями являются уровень изоляции SNAPSHOT, а также уровень изоляции READ COMMITTED в случае присвоения параметру READ_COMMITTED_SNAPSHOT значения ON. Эти уровни изоляции не запрашивают совмещаемых блокировок на строках данных во время операций чтения. Только блокировки SCH-S удерживаются на уровне таблицы.

Уровни изоляции транзакций могут быть установлены с использованием Transact-SQL или через API базы данных.

  • Transact-SQL
    В сценариях Transact-SQL используется инструкция SET TRANSACTION ISOLATION LEVEL.

  • ADO
    Приложения ADO устанавливают для свойства IsolationLevel объекта Connection значения adXactReadUncommitted, adXactReadCommitted, adXactRepeatableRead или adXactReadSerializable.

  • ADO.NET
    Приложения ADO.NET, использующие управляемое пространство имен System.Data.SqlClient, могут вызывать метод SqlConnection.BeginTransaction и устанавливать для параметра IsolationLevel option значения Unspecified, Chaos, ReadUncommitted, ReadCommitted, RepeatableRead, Serializable и Snapshot.

  • OLE DB
    Приступив к выполнению транзакции, приложения, использующие OLE DB, вызывают ITransactionLocal::StartTransaction с установленными для параметра isoLevel значениями ISOLATIONLEVEL_READUNCOMMITTED, ISOLATIONLEVEL_READCOMMITTED, ISOLATIONLEVEL_REPEATABLEREAD, ISOLATIONLEVEL_SNAPSHOT или ISOLATIONLEVEL_SERIALIZABLE.

    При указании уровня изоляции транзакций в режиме автоматической фиксации приложения OLE DB applications могут присваивать свойству DBPROP_SESS_AUTOCOMMITISOLEVELS параметра DBPROPSET_SESSION значения 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
    Приложения ODBC вызывают SQLSetConnectAttr с установленным для параметра Attribute значением SQL_ATTR_TXN_ISOLATION и установленными для параметра ValuePtr значениями SQL_TXN_READ_UNCOMMITTED, SQL_TXN_READ_COMMITTED, SQL_TXN_REPEATABLE_READ или SQL_TXN_SERIALIZABLE.

    Для транзакций моментального снимка приложения вызывают SQLSetConnectAttr, установив Attribute на SQL_COPT_SS_TXN_ISOLATION и ValuePtr на SQL_TXN_SS_SNAPSHOT. Транзакция моментального снимка может быть получена с использованием или SQL_COPT_SS_TXN_ISOLATION, или SQL_ATTR_TXN_ISOLATION.