SQL Server's LEER COMPROBADO INSTANTÁNEA vs INSTANTÁNEA

23

Estaba investigando las diferencias entre los niveles de aislamiento READ COMMITTED SNAPSHOTy SQL Server SNAPSHOTy encontré el siguiente recurso:

Elección de niveles de aislamiento basados ​​en versiones de fila

Para la mayoría de las aplicaciones, se recomienda el aislamiento comprometido de lectura mediante el control de versiones de filas sobre el aislamiento de instantáneas por los siguientes motivos:

  • Consume menos espacio tempdb que el aislamiento de instantáneas.

  • El aislamiento de instantáneas es vulnerable a conflictos de actualización que no son aplicables al aislamiento confirmado de lectura mediante el control de versiones de filas. Cuando una transacción que se ejecuta con aislamiento de instantánea lee datos que luego se modifican por otra transacción, una actualización de la transacción de instantánea a los mismos datos provoca un conflicto de actualización y la transacción finaliza y retrocede. Esto no es un problema con el aislamiento confirmado de lectura usando el control de versiones de fila.

Soy algo nuevo en estos temas, pero parece que no puedo entender los dos puntos del enlace de arriba.

  1. ¿Por qué el espacio tempdb sería diferente para estos modos? ¿Uno almacena versiones más granulares que el otro?

  2. ¿Por qué el aislamiento de instantáneas es más vulnerable a los conflictos de actualización?

John Russell
fuente

Respuestas:

18
  1. READ COMMITTED SNAPSHOTusa una nueva instantánea después de cada declaración. Eso significa que menos versiones de fila se mantienen con vida. (La declaración que citó de los documentos es un poco engañosa porque sugiere que esto siempre es cierto; solo es cierto en el caso de SNAPSHOTtransacciones de larga duración ). Las versiones de filas de instantáneas se crean en escrituras. Las lecturas no influyen en lo que se pone en tempdb. Los escritores no pueden prever qué lecturas se llevarán a cabo en el futuro. Los lectores solo influyen en lo que se puede purgar.
  2. Cuando una SNAPSHOTtransacción T1escribe en una fila que fue modificada por otra transacción T2en el tiempo entre el T1inicio y el T1intento de escritura, la declaración falla con un error de conflicto de actualización. Este es un modelo de concurrencia optimista. With READ COMMITTED SNAPSHOT T1esperaría T2a liberar el bloqueo X en la fila y continuaría normalmente.
usr
fuente
1
Para el n. ° 2, ¿es seguro decir que SNAPSHOT no bloquea exclusivamente las actualizaciones, solo se basa en el control de versiones de filas?
John Russell
1
@JohnRussell se bloquea exclusivamente para admitir la reversión. Todas las escrituras deben bloquear X para garantizar que la fila se pueda restaurar en caso de una reversión.
Usr
0

Una diferencia más entre la instantánea y la instantánea confirmada de lectura es la siguiente.

  1. Instantánea

En la primera sesión

SET TRAN ISOLATION LEVEL INSTANTÁNEA COMIENCE TRAN SELECT * DESDE TB1 ..... .....

En la segunda sesión

Actualizar TB1 SET NAME = NAME + 'test' Donde id = 1

En la primera sesión

SELECCIONAR * DESDE TB1: ESTO VOLVERÁ el nombre del valor para ID = 1, no nombre + 'prueba' COMPROMISO

En la instantánea de lectura confirmada, la primera selección en la sesión 1 devolverá el nombre para id = 1, y la segunda selección devolverá el nombre + 'prueba'.

Por lo tanto, en el aislamiento de instantáneas, SQL SERVER realiza una instantánea al comienzo de la transacción y lee de esa instantánea durante toda la transacción.

En la instantánea confirmada de lectura, la instantánea se toma para cada instrucción SELECT durante la transacción.

Artashes Khachatryan
fuente