Hemos hablado de nolock y ahora vamos a hacer un pequeño viaje por los niveles de aislamiento basados en instantáneas. Primero un poco de contexto.
En el mundo de las bases de datos y los estándares se habla de las propiedades que deben cumplir los motores de bases de datos en cuanto al ACID , atomicidad, consistendia, aislamiento y durabilidad. No voy a entrar en esas explicaciones, porque son largas y quizá no vengan al caso en este artículo. Sin embargo si que necesitamos saber algo de la parte del aislamiento.
Los problemas que se enumeran sobre los niveles de aislamiento son
* Lecturas sucias
* Lecturas no repetibles
* Lecturas fantasma
Aquí podéis encontrar informacion acerca del acid
https://es.wikipedia.org/wiki/Aislamiento_(ACID)

Dicho esto, al final, los motores de bases de datos han de implementar estos atributos estandar, y cada uno lo hace según su propio criterio. En general, y podríamos decir que hay dos metodos, basarnos en bloqueos y basarnos en instantáneas. Intento explicar las diferencias:

Supongamos que tenemos dos conexiones con una transaccion abierta, la transaccion a modifica un registro y la transaccion b
* Si estamos basados en bloqueos , la transacción B tendrá que esperar a que la transacción A acabe, puesto que el registro está modificado, pero no confirmado. Si usamos el hint nolock, veremos el datos sin confirmar (lecturas sucias)

*Si estamos basados en instantáneas  entonces lo que sucede es que cuando se modifica el registro, la ultima versión confirmada de la transacción se guarda para que si otro usuario la reclama pueda obtenerla, esta vez sin bloqueos puesto que hay un registro que tiene un valor ya confirmado (aunque potencialmente vaya a cambiar)

 

Si las instantáneas se destruyen toda vez que la transacción que modifica el registro (transaccion A) acaba, y dentro de la misma transaccion B volvemos a ejecutar la misma sentencia de consulta, el resultado será que dentro de la transacción B hemos visto dos valores distintos para el registro en cuestion, produciendose así lecturas no repetibles.

Las lecturas fantasma sin embargo se producen cuando esa selección se hace sobre todos los registros y pueden aparecer o desaparecer registros del final.

En SQL Server tradicionalmente y por defecto el modelo de implementación está basado en bloqueos, sin embargo desde hace ya bastantes versiones, se puede habilitar para estar basado en instantaneas. La forma de hacerlo sería así

Este comando habilita a la base de datos demo2 para implementación basada en instantáneas, lo que hace que automaticamente se eliminen muchos de los bloqueos que podamos tener, pero OJO no es recomendable cambiar este valor sin probar la aplicacion que use SQL bien antes, ya que puede que los desarrolladores se hayan basado en que hay bloqueos para ciertas implementaciones, y eliminar esos bloqueos podría hacer que la aplicación no funcionara bien. Sin embargo, si eres desarrollador y estas creando una aplicacion nueva y en el pasado los bloqueos te han mareado mucho… no lo dudes, desde el minuto 0 hablita este nivel de aislamiento.

Otros gestores, como Oracle, por defecto se comportan con la implementación basada en instantáneas.

Además del nivel de aislamiento por defecto, se puede habilitar un nivel mas de instantaneas, aunque para hacerlo hay primero que habilitarlo en la base de datos y además usar un comando SET TRANSACTION ISOLATION LEVEL

la forma de habilitarlo es la siguiente

En los proximos dias, publicaré una demostración sobre estos niveles de aislamiento y como se comportan así en unos pocos minutos podremos tener una formación más completa sobre la materia

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *