Personalizar el nivel de aislamiento de transacción

READ COMMITTED es el nivel de aislamiento predeterminado del SQL Server Database Engine (Motor de base de datos de SQL Server) de Microsoft. Cuando es necesario utilizar una aplicación en un nivel de aislamiento distinto, se pueden utilizar los métodos que se indican a continuación para configurar el nivel de aislamiento:

  • Ejecutar la instrucción SET TRANSACTION ISOLATION LEVEL.

  • Para las aplicaciones ADO.NET que utilicen el espacio de nombres administrado System.Data.SqlClient, especificar una opción IsolationLevel mediante el método SqlConnection.BeginTransaction.

  • Las aplicaciones que usan ADO pueden establecer la propiedad Autocommit Isolation Levels.

  • Al iniciar una transacción, las aplicaciones que utilicen OLE DB pueden llamar a ITransactionLocal::StartTransaction con la propiedad isoLevel establecida en el nivel de aislamiento de transacción deseado. Si se especifica el nivel de aislamiento en el modo de confirmación automática, para las aplicaciones que utilicen OLE DB se puede establecer la propiedad DBPROPSET_SESSION, DBPROP_SESS_AUTOCOMMITISOLEVELS en el nivel de aislamiento de transacción deseado.

  • Para las aplicaciones que utilicen ODBC, establecer el atributo SQL_COPT_SS_TXN_ISOLATION mediante SQLSetConnectAttr.

Para obtener más información acerca de cómo configurar los niveles de aislamiento de transacción, vea Ajustar los niveles de aislamiento de transacción.

Si se especifica el nivel de aislamiento, el bloqueo de todas las consultas e instrucciones del lenguaje de manipulación de datos (DML) en la sesión de SQL Server se aplica en ese nivel de aislamiento. El nivel de aislamiento permanece vigente hasta que finaliza la sesión o hasta que se cambia la configuración del nivel de aislamiento.

En el siguiente ejemplo, se configura el nivel de aislamiento SERIALIZABLE:

USE AdventureWorks2008R2;
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
GO
BEGIN TRANSACTION;
SELECT BusinessEntityID
    FROM HumanResources.Employee;
GO

El nivel de aislamiento se puede pasar por alto, si es necesario, para consultas o instrucciones DML individuales. Para ello debe especificarse una sugerencia de tabla. El hecho de especificar una sugerencia de tabla no afecta a las demás instrucciones de la sesión. Se recomienda que las sugerencias de tabla sólo se utilicen para modificar el comportamiento predeterminado en los casos estrictamente necesarios.

Es posible que Motor de base de datos tenga que adquirir bloqueos al leer los metadatos incluso si el nivel de aislamiento se ha establecido en un nivel en el que no se soliciten bloqueos compartidos al leer los datos. Por ejemplo, una transacción que se ejecute en el nivel de aislamiento de lectura sin confirmar no adquiere bloqueos compartidos al leer datos, pero es probable que tenga que solicitar bloqueos en alguna ocasión al leer una vista de catálogo del sistema. Esto significa que es posible que una transacción con lectura sin confirmar provoque un bloqueo cuando ejecute consultas en una tabla mientras otra transacción simultánea modifica los metadatos de la tabla.

Para determinar el nivel de aislamiento de transacción que está establecido actualmente, utilice la instrucción DBCC USEROPTIONS como se indica en el siguiente ejemplo. El conjunto de resultados puede variar según el conjunto de resultados del sistema.

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

El conjunto de resultados es el siguiente.

Opción Set                   Valor

---------------------------- -------------------------------------------

textsize                     2147483647

language                     us_english

dateformat                   mdy

datefirst                    7

... ...

Nivel de aislamiento repeatable read

(14 filas afectadas)

Ejecución de DBCC completada. Si hay mensajes de error, consulte al administrador del sistema.