Ajustar los niveles de aislamiento de transacción

La propiedad de aislamiento es una de las cuatro propiedades ACID (atomicidad, coherencia, aislamiento y durabilidad) que una unidad lógica de trabajo debe ostentar para ser calificada como transacción. Es la capacidad de proteger las transacciones de los efectos de las actualizaciones que realizan otras transacciones simultáneas. Se puede personalizar el nivel de aislamiento de cada transacción.

El SQL Server Database Engine (Motor de base de datos de SQL Server) admite los niveles de aislamiento de transacción definidos en SQL-92. La configuración de dichos niveles permite a los programadores compensar el riesgo superior de que se produzcan ciertos problemas de integridad al permitirse un mayor acceso simultáneo a los datos. Los niveles de aislamiento de transacción son los siguientes:

  • READ UNCOMMITTED

  • READ COMMITTED

  • REPEATABLE READ

  • SNAPSHOT

  • SERIALIZABLE

Cada nivel de aislamiento ofrece más aislamiento que el anterior porque contiene más bloqueos restrictivos durante periodos más largos, pero existen dos excepciones: SNAPSHOT y READ COMMITTED cuando el valor de READ_COMMITTED_SNAPSHOT es ON. Estos niveles de aislamiento no adquieren bloqueos compartidos en filas de datos durante las operaciones de lectura. Los únicos bloqueos que se mantienen en las tablas son los bloqueos SCH-S.

Se pueden establecer los niveles de aislamiento de transacción con Transact-SQL o mediante una API de bases de datos.

  • Transact-SQL
    Los scripts Transact-SQL utilizan la instrucción SET TRANSACTION ISOLATION LEVEL.

  • ADO
    Las aplicaciones ADO establecen la propiedad IsolationLevel del objeto Connection como adXactReadUncommitted, adXactReadCommitted, adXactRepeatableRead o adXactReadSerializable.

  • ADO.NET
    Las aplicaciones ADO.NET que utilizan el espacio de nombres administrado por System.Data.SqlClient pueden llamar al método SqlConnection.BeginTransaction y establecer la opción IsolationLevel como Unspecified, Chaos, ReadUncommitted, ReadCommitted, RepeatableRead, Serializable y Snapshot.

  • OLE DB
    Cuando se inicia una transacción, las aplicaciones que utilizan OLE DB llaman a ITransactionLocal::StartTransaction con isoLevel establecido en ISOLATIONLEVEL_READUNCOMMITTED, ISOLATIONLEVEL_READCOMMITTED, ISOLATIONLEVEL_REPEATABLEREAD, ISOLATIONLEVEL_SNAPSHOT o ISOLATIONLEVEL_SERIALIZABLE.

    Cuando se especifica el nivel de aislamiento de transacción en el modo de confirmación automática, las aplicaciones OLE DB pueden establecer la propiedad DBPROP_SESS_AUTOCOMMITISOLEVELS de DBPROPSET_SESSION en DBPROPVAL_TI_CHAOS, DBPROPVAL_TI_READUNCOMMITTED, DBPROPVAL_TI_BROWSE, DBPROPVAL_TI_CURSORSTABILITY, DBPROPVAL_TI_READCOMMITTED, DBPROPVAL_TI_REPEATABLEREAD, DBPROPVAL_TI_SERIALIZABLE, DBPROPVAL_TI_ISOLATED o DBPROPVAL_TI_SNAPSHOT.

  • ODBC
    Las aplicaciones de ODBC llaman a SQLSetConnectAttr con Attribute establecido en SQL_ATTR_TXN_ISOLATION y ValuePtr establecido en SQL_TXN_READ_UNCOMMITTED, SQL_TXN_READ_COMMITTED, SQL_TXN_REPEATABLE_READ o SQL_TXN_SERIALIZABLE.

    Para las transacciones de instantáneas, las aplicaciones llaman a SQLSetConnectAttr con Attribute establecido en SQL_COPT_SS_TXN_ISOLATION y ValuePtr establecido en SQL_TXN_SS_SNAPSHOT. Una transacción de instantánea se puede recuperar mediante SQL_COPT_SS_TXN_ISOLATION o SQL_ATTR_TXN_ISOLATION.