¿Cuantas veces ante un bloqueo hemos usado with nolock? En muchas ocasiones incluso es posible que lo hayamos recomendado. Lo que dice el sentido común es que es posible que leamos transacciones que no han sido validadas, y esto, no parece que sea muy importante.

Es decir, si por ejemplo usamos una sentencia select sum(ImporteFacturado) from facturas  with(nolock) ¿que puede pasar?

En realidad lo que te van a comentar generalmente es que nada demasiado grave, que si una factura está a medio grabarse en una transacción sin confirmar pues veras ese importe, y si luego hacen rollback desaparecerá. Y tu sensación será.. tampoco es para tanto.. ¿verdad?

En realidad, internamente pasan muchas mas cosas, no solamente se leen transacciones sucias de usuario, sino también transacciones sucias de sistema, esto es, todo lo que el motor necesite para organizar páginas estará bajo lecturas sucias.

Y la cuestión es ¿y eso que implicaciones tiene?

Las implicaciones son a veces imprevisibles,  lo normal es que no pase gran cosa, pero simplemente decir eso es una temeridad puesto que aunque solo variara un registro las implicaciones de negocio son imprevisibles. En el video que pueden ver a continuación tienen una demostración que creo que ilustra bastante bien lo que puede pasar.

Esta demostración está inspirada en una del gran Itzik Ben-Gan https://twitter.com/ItzikBenGan , sirva de agradecimiento a todo lo que hemos aprendido  y seguimos aprendiendo con él.

 

Una solución a esto, sin entrar demasiado en detalle es utilizar niveles de aislamiento basados en instantáneas,  veamos un ejemplo

 

En conclusión. No quiero demonizar el uso de nolock, pero al menos, cuando lo usemos, que seamos conscientes de las alternativas y de sus peligros, de todos ellos.

Deja un comentario

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