La mayoría de los foros y ejemplos en línea siempre sugieren tener ambos ALLOW_SNAPSHOT_ISOLATION
y READ_COMMITTED_SNAPSHOT
activarlos siempre que alguien haga una instantánea, versiones de fila o preguntas similares.
Supongo que la palabra INSTANTÁNEA en ambos entornos se vuelve un poco confusa. Pensé que, para que el motor de la base de datos use el control de versiones de fila en lugar de bloqueos para el comportamiento predeterminado READ_COMMITTED, la base de datos READ_COMMITTED_SNAPSHOT
se establece en ON independientemente de qué ALLOW_SNAPSHOT_ISOLATION
configuración.
La ALLOW_SNAPSHOT_ISOLATION
configuración se establece en ON solo para permitir el aislamiento de instantáneas al iniciar una transacción (por ejemplo, CONFIGURAR EL INSTANTÁNEA DEL NIVEL DE AISLAMIENTO DE LA TRANSACCIÓN) independientemente de la READ_COMMITTED_SNAPSHOT
configuración.
La única razón para tener estas dos configuraciones establecidas en ON es cuando necesita tener READ COMMITTED versioning de fila Y aislamiento de instantánea.
Mi pregunta es, ¿es mi comprensión incorrecta de alguna manera? ¿Y que estos dos ajustes tienen que estar siempre en ON juntos (especialmente para las versiones READ COMMITTED row)?
OK, volví a casa y probé. Aquí está la observación.
Primera prueba con ambas configuraciones confirmadas como OFF.
Consulta 1
Consulta 2
En esta prueba, la consulta 2 está esperando que se confirme la consulta 1, dm_tran_locks El DMV muestra ese bloqueo exclusivo en la TABLA 1 incurrido por la consulta 1.
Segunda prueba , deshaga la transacción anterior, configure READ_COMMITTED_SNAPSHOT ON pero deje ALLOW_SNAPSHOT_ISOLATION OFF.
Ejecute la consulta 1 y la consulta 2. El DMV muestra que la consulta 1 tiene un bloqueo exclusivo, pero la consulta 2 devuelve detalles con 'Original' sin que la consulta 1 confirme la transacción. Parece que la versión de la fila READ_COMMITTED está en su lugar.
Al agregar la
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
consulta 1 y la consulta 2, y ejecutar la consulta 1 o la consulta 2, se produce un error: la transacción de aislamiento de instantánea no pudo acceder a la base de datos 'TEST' porque el aislamiento de instantánea no está permitido en esta base de datos. Use ALTER DATABASE para permitir el aislamiento de instantáneas.Tercera prueba , deshacer la transacción anterior. Establezca READ_COMMITTED_SNAPSHOT OFF y ALLOW_SNAPSHOT_ISOLATION ON.
Ejecute la consulta 1 y luego la consulta 2. El DMV muestra el bloqueo exclusivo incurrido por la consulta 1. La consulta 2 parece estar esperando que se complete la consulta 1. Activar ALLOW_SNAPSHOT_ISOLATION ON no parece habilitar READ COMMITTED row versioning.
Agregar
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
tanto a la consulta 1 como a la consulta 2. Ejecute la consulta 1 y luego la consulta 2. Mientras el DMV muestra que la consulta 1 tiene un bloqueo exclusivo, la consulta 2 devuelve detalles con 'Original'. El aislamiento de la instantánea parece estar en su lugar.La observación de la prueba muestra que
READ_COMMITTED_SNAPSHOT
sí mismo habilita / deshabilita la versión READ COMMITTED de la fila independientemente de laALLOW_SNAPSHOT_ISOLATION
configuración, y viceversa.fuente
Su comprensión es correcta. Me gusta la definición corta, limpia y simple de aquí :
Parece que muchos malentendidos provienen de la propia EM. Por ejemplo, aquí dicen:
Pero el "aislamiento de instantánea" mencionado no es igual al comportamiento de la transacción para la cual
set transaction isolation level snapshot
se aplica.En cuanto a la diferencia, una buena explicación está aquí .
Probablemente sería mejor si READ_COMMITTED_SNAPSHOT se nombrara como READ_COMMITTED_ROW_VERSIONING o algo así. :)
fuente
Me gusta este resumen de Microsoft :
fuente