Los niveles de aislamiento en DBMS se utilizan para mantener la ejecución concurrente de transacciones sin sufrir interrupciones debido a problemas como lectura sucia, lectura fantasma y lectura no repetible. El aislamiento de instantáneas es uno de esos niveles de aislamiento que logra el nivel máximo de concurrencia.
En este artículo entenderemos dos conceptos:
- Aislamiento de instantáneas
- Técnica de versionado de filas
Nivel de aislamiento de instantáneas:
En los niveles de aislamiento basados en bloqueo, la transacción que lee los datos bloquea la transacción que intenta escribir los datos y viceversa, lo que reduce el nivel de concurrencia y degrada el rendimiento del sistema. Para superar este problema, se introdujo el aislamiento de instantáneas. En lugar de adquirir bloqueos de rango de claves en las transacciones, el aislamiento de instantáneas utiliza el control de versiones de filas.
Técnica de versionado de filas:
En el servidor SQL, la versión de fila se puede definir como un tipo de datos que ayuda a marcar la versión de las filas de una tabla con valores únicos. En el control de versiones de filas, el servidor SQL almacena todas las copias anteriores de una fila que fue modificada por una transacción en tempDB . Si una fila en particular se modifica varias veces, se almacenarán varias copias anteriores de la fila en tempdb durante el tiempo que las requiera cualquier transacción en curso o futura.
El nombre “instantánea” se centra en el hecho de que una copia similar de la base de datos estará disponible para todas las consultas de transacciones, como estaba al comienzo de la transacción. La técnica de control de versiones de filas en el aislamiento de instantáneas ayuda al servidor SQL a evitar bloqueos, lo que permite que los datos de lectura de transacciones no bloqueen los datos de modificación de transacciones y viceversa. Pero una transacción que escribe datos puede bloquear otras transacciones que intentan escribir datos al mismo tiempo, este es un conflicto de actualización que ocurre en el aislamiento de instantáneas. Como resultado de este conflicto de actualización, cualquiera de las dos transacciones debe revertirse o eliminarse.
Propiedades del aislamiento de instantáneas:
- Sin conflicto: el aislamiento de instantáneas sigue un control de concurrencia optimista que establece que es muy probable que las transacciones no entren en conflicto entre sí.
- Prefijo: cada Node puede ver la transacción en un orden similar.
- Consistencia Interna: Las operaciones de lectura dentro de una transacción, solo observarán la última operación de escritura perteneciente a esa transacción.
- Coherencia externa: entre dos transacciones T1 y T2, las operaciones de lectura de T2 sin una operación de escritura previa observarán el estado escrito por la transacción T1 con la condición de que ninguna otra transacción haya escrito en T1.
Por ejemplo: considere una situación en la que un lote de seis estudiantes se divide en dos equipos de tres miembros cada uno en función de que su número de rollo sea par o impar. Anteriormente, el Equipo-1 contenía estudiantes con números de rollo pares y el Equipo-2 tenía estudiantes con números de rollo impares. Después de un tiempo, el maestro decidió cambiar al Equipo-1 con estudiantes impares y al Equipo-2 con números pares. Para ello se utilizan dos transacciones concurrentes, T1 que cambia de impar a par, y T2 que cambia de par a impar.
Como podemos ver, la tabla al final contendrá todos los miembros que tengan números impares o cada miembro que tenga un número par. Esto se debe a que en la ejecución serializable solo se ejecutará una transacción a la vez. T1 dejará la mesa solo con números pares y después de T1, T2 convertirá todos los números pares en impares.
Al examinar el resultado de estas transacciones mediante el aislamiento de instantáneas, podemos notar que T1 y T2 están trabajando en la versión anterior de la base de datos almacenada en tempDB. T1 selecciona todos los números de rollo impares y los convierte en pares y, al mismo tiempo, T2 selecciona las filas que tienen números de rollo pares (excluyendo las filas que fueron cambiadas por T1 a pares) y las modifica a impares. De esta manera, podemos cambiar con precisión el tipo de cada número de lista de candidatos
Varios niveles de aislamiento de instantáneas:
- Aislamiento de instantáneas de lectura confirmada (RCSI): en RCSI, el servidor SQL mantiene instantáneas de las actualizaciones de datos realizadas por operaciones de escritura a nivel de declaración, es decir, las instantáneas tienen una vida más corta. Los lectores de datos obtendrán los datos almacenados en la última instantánea o versión confirmada de tempDB antes de que comience la declaración de lectura. RCSI también se conoce como el nivel de aislamiento de instantáneas de nivel de declaración.
- Aislamiento de instantáneas: en el aislamiento de instantáneas, el servidor SQL mantiene instantáneas de las actualizaciones de datos realizadas por operaciones de escritura en el nivel transaccional, es decir, la instantánea se mantiene durante el tiempo de vida de una transacción. Los lectores de datos obtendrán datos almacenados en la última versión confirmada de tempDB antes de que comenzara la transacción. El aislamiento de instantáneas también se conoce como nivel de aislamiento de instantáneas a nivel de transacción.
Limitaciones del aislamiento de instantáneas:
Además de todas las ventajas añadidas al sistema cuando se activa el aislamiento de instantáneas, también existen ciertas limitaciones en el nivel de instantáneas.
- La sobrecarga adicional de mantener las versiones de fila para cada transacción que actualiza los datos en tempDB.
- Las operaciones de lectura y escritura no se bloquearán entre sí, pero aun así se pueden producir bloqueos entre dos operaciones de escritura (lo que se conoce como conflictos de actualización).