Alcance de los niveles de aislamiento

Cuando se ejecuta el comando set transaction isolation level para fijar el nivel de aislamiento a un valor ¿hasta donde queda fijado ese valor? es para la conexión hasta el final de esta?

Lo cierto es que en mi opinión se comporta como debe comportarse, es decir, manteniendo ese nivel de aislamiento en el ámbito en el que se haya ejecutado.

Imaginemos la siguiente circunstancia. Tenemos un procedimiento almacenado que establece el nivel de aislamiento a un valor, al ejecutarlo y terminar ¿como queda?

Lo mejor siempre es probar. La primera de las pruebas sería ejecutar el procedimiento y comprobar cual es el nivel de aislamiento dentro del procedimiento y al salir de él

Para eso la tabla sys.dm_db_exec_sessions tiene la información necesaria.

 

El query devuelve cual es él nivel de aislamiento de la conexión actual y de esta forma podremos comprobar como se ha comportado.

En la ejecución inicial devuelve el nivel de aislamiento por defecto que es Read Committed.

para comprobar el comportamiento vamos a crear un procedimiento almacenado que cambie el nivel de aislamiento y vamos a ver que devuelve.

Una vez instalado vamos a obtener cual es el nivel de aislamiento actual con el primero de los queries, ejecutar el procedimiento almacenado y volver a obtener el nivel de aislamiento actual

 

Podemos comprobar como dentro del procedimiento el nivel de aislamiento ha cambiado mientras que fuera se mantiene.

La otra duda es que pasa si el procedimiento almacenado a llamase a un segundo (que estaría por tanto embebido en la ejecución del primero. 

para eso simplemente creamos un procedimiento almacenado que solamente tiene la instrucción que nos devuelve el nivel de aislamiento actual.

el pseudocódigo sería

  • Obtener aislamiento actual
  • Procedimiento almacenado que lo cambia y llama a otro
  • Segundo procedimiento comprueba nivel de aislamiento actual
  • Terminan procedimientos
  • Obtener aislamiento actual

Y el resultado es

 

Conclusión

En una conexión si lo primero que se hace es cambiar el nivel de aislamiento, éste permanecerá invariante dentro de toda la conexión, Sin embargo si es un trozo de código tipo procedimiento almacenado el que hace ese cambio, su ámbito se reduce a la vida del procedimiento almacenado.