Read Committed Snapshot Isolation (RCSI)

Con el lanzamiento de SQL Server 2005 se introdujo un nuevo nivel de aislamiento llamado Read Committed Snapshot (aislamiento de instantáneas).

¿Qué son los niveles de aislamiento?

El nivel de aislamiento de una transacción (transaction isolation level) define el grado en que se aísla una transacción de las modificaciones de recursos o datos realizadas por otras transacciones. El nivel de aislamiento de una transacción es una característica de vital importancia en el desarrollo de aplicaciones de base de datos, ya que afecta a los tipos y duración de bloqueos que se producen en nuestra infraestructura de base de datos, lo cual, tiene efectos directos en el rendimiento y tiempo de respuesta de nuestras consultas y transacciones. Además, el nivel de aislamiento nos permite indicar cómo deseamos que se comporte nuestro motor de base de datos frente a situaciones (…) que pueden impactar consistentemente en la eficacia de nuestros desarrollos en entornos de base de datos con concurrencia.

Se pueden consultar más detalles en el artículo sobre ¿Qué es el nivel de aislamiento (Isolation Level) de una Transacción? ¿Qué niveles de aislamiento ofrece SQL Server?

¿Por qué es tan diferente el nivel de aislamiento Snapshot?

Este nivel de aislamiento imita el Nivel 1 de lectura confirmada (Level 1 Read Committed), que es el predeterminado de SQL Server, pero permite una mayor concurrencia y menos bloqueo ya que utiliza un principio de versiones en los registros bloqueados.

Los procesos de lectura y escritura reciben diferentes "versiones" del registro para que no bloquee cada vez que mantiene la coherencia transaccional. Estas versiones de filas se ayudan del almacén de versiones que se mantiene en TempDB.

Optimización para Microsoft Dynamics NAV

Desde la perspectiva de aplicaciones como Microsoft Dynamics NAV no es muy útil como NAV envía sugerencias de nivel de aislamiento con la mayoría de los estados que anularán RCSI, sino que este nivel de asilamiento tendrá un beneficio cuando otras aplicaciones externas accedan a los registros en la base de datos de producción NAV tales como informes, opiniones, y aplicaciones secundarias como SQL Server Reporting Services (SSRS), procesos Extract, Transform and Load (ETL), etc..

Activar Read Committed Snapshot Isolation

Primero comprobemos que no está activado, para ello desde el SQL Server Managment Studio ejecutamos la siguiente instrucción:

USE MASTER
GO

SELECT is_read_committed_snapshot_on FROM sys.databases WHERE name= 'database'

Si el valor devuelto es 0 el nivel de aislamiento de instantáneas (read committed snapshot) no está activado. Para activarlo debemos ejecutar las siguientes instrucciones T-SQL:

USE database
GO

ALTER DATABASE database
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
GO

ALTER DATABASE database SET READ_COMMITTED_SNAPSHOT ON
GO

ALTER DATABASE database SET MULTI_USER
GO

Es muy importante poner en modo de usuario único (SINGLE_USER) la base de datos primero.

NOTA: Cuidado la forma en que escribimos las palabras ROLLBACK IMMEDIATE porque suelen dar errores del tipo  Incorrect syntax near.

Es importante tener la base de datos temporales TempDB configurada según las recomendaciones de Microsoft o la asignación de páginas pueden producir cuellos de botella. En un post dentro de poco explicaré cuales son estas recomendaciones.

Al parecer hay cambios en las propiedades de la base de datos en la próxima versión de SQL Server 2011 (code name Denali) y no será necesario escribir el código anterior para activar este nivel de aislamiento de instantáneas, aquí os dejo el post en inglés y una imagen:

image

Comentarios