Share via


Niveles de aislamiento

Cuando se utiliza el bloqueo como mecanismo de control de transacciones, se pueden resolver problemas de simultaneidad. El bloqueo permite que todas las transacciones se ejecuten totalmente aisladas entre sí, aunque en cualquier momento puede ejecutarse más de una transacción. El nivel en el que una transacción está preparada para aceptar datos incoherentes se conoce como nivel de aislamiento. Un nivel de aislamiento alto ofrece más protección contra la incoherencia de los datos, pero tiene el inconveniente de que disminuye la simultaneidad.

En SQL Server Compact, el nivel de aislamiento que requiere una aplicación determina el comportamiento de bloqueo que SQL Server Compact usa.

SQL Server Compact admite los siguientes niveles de aislamiento (de menor a mayor):

  • Nivel de aislamiento de lectura confirmada (Read Committed, valor predeterminado de SQL Server Compact)

  • Nivel de aislamiento de lectura repetible (Repeatable Read)

  • Nivel de aislamiento serializable (Serializable, las transacciones están completamente aisladas entre sí)

Cuanto mayor es el nivel de aislamiento, mayor es la protección de los datos contra la incoherencia. Sin embargo, disminuye la simultaneidad de la transacción y afecta al acceso multiusuario.

Nota

SQL Server Compact garantiza que una transacción no pueda leer los datos no confirmados de otra transacción (lectura no actualizada). Esto se consigue utilizando un mecanismo de versiones de página que permite a los usuarios leer datos sin solicitar bloqueos S en los datos. Esto ofrece una simultaneidad excepcional para las operaciones de lectura (SELECT).

Niveles de aislamiento y problemas de simultaneidad

En la tabla siguiente se muestran los niveles de aislamiento y los problemas de simultaneidad relacionados.

Nota

Los problemas de simultaneidad que pueden producirse incluyen la dependencia sin confirmar, análisis incoherentes y lecturas fantasma. Para obtener más información acerca de los problemas de simultaneidad, vea Simultaneidad.

Nivel de aislamiento

Dependencia sin confirmar (lecturas no actualizadas)

Análisis incoherente (lecturas no repetibles)

Lecturas fantasma

Lectura confirmada

No

Lectura repetible

No

No

Serializable

No

No

No

Los niveles de aislamiento se pueden establecer mediante programación o mediante la sintaxis SQL SET TRANSACTION ISOLATION LEVEL. Para obtener más información, vea Nivel de aislamiento de transacción.

Nivel de aislamiento bajo el ámbito de la transacción

El nivel de aislamiento predeterminado para System.Transaction es Readcommitted. Sin embargo, de manera predeterminada, una transacción de un ámbito de transacción se ejecuta con el nivel de aislamiento definido en Serializable. Por tanto, cuando una conexión de SQL Server Compact aparece inscrita en un ámbito de transacción, la transacción implícita (que es una transacción de SQL Server Compact creada internamente para el ámbito de la transacción) se ejecuta de manera predeterminada en el nivel de aislamiento Serializable. Algunos de los constructores sobrecargados de la clase TransactionScope aceptan el nivel de aislamiento como parámetro. Estos deberían usarse para especificar un valor diferente del nivel de aislamiento para la transacción implícita. Si el nivel de aislamiento especificado no está admitido por SQL Server Compact, la inscripción de una conexión de SQL Server Compact a un ámbito de la transacción iniciará una excepción.

Además, la propiedad default lock timeout que se especifica como parte de la cadena de conexión, rige el tiempo que esperará la transacción. Sin embargo, cuando una conexión está inscrita en un TransactionScope, el valor TimeSpan del TransactionScope invalida esta propiedad. Por ejemplo, si el valor ConnectionString contenía 1000 ms como el valor de default lock timeout y la conexión se inscribe en un TransactionScope de 100 ms, la transacción ambiente durará únicamente 100 ms y no 1000 ms. Esto significa que si desea que la aplicación tenga mayores tiempos de espera de transacción y ejecute comandos en un TransactionScope, tendrá que especificar el valor de tiempo de espera en la cadena de conexión y el TimeSpan para el valor TransactionScope.

Nota

El valor predeterminado de default lock timeou" es 2000 minutos y el de un TransactionScope es 1 minuto.

Vea también

Conceptos

Transacciones (SQL Server Compact)

Bloquear (SQL Server Compact)

Cursores (SQL Server Compact)