none
Diferencias entre el uso de (nolock) y with(nolock) en SQL Server 2014 RRS feed

  • Pregunta

  • Hola Comunidad

    Por favor su ayuda, estoy entrando en una discusión con el área de base de datos de mi trabajo, dado que ellos me reportan que se presentan bloqueos en algunas tablas de una base de datos que es utilizada desde un aplicativo que tiene mucha concurrencia.

    Ellos comentan que se evidencia que existen varias consultas dentro de procedimientos almacenados que tienen el (nolock) y que se debería cambiar por el with(nolock) para evitar los bloqueos.

    He leído muchos post, paginas, hice pruebas en la base de test que tiene la misma versión en la cual cargue una tabla con aproximadamente 7 millones de registros y abrí 2 sesiones evidenciando los siguientes escenarios:

    1) En la 1era sesión ejecute un update para modificar un campo a toda la tabla y en la 2da un select primero sin el nolock evidenciando que el update toma el bloqueo de la tabla y el select no finaliza hasta que el update termine de actualizar todos los registros.

    2) Ejecuto nuevamente el update masivo a la tabla y en la otra sesión ejecuto el mismo select pero ahora incluido el (nolock) evidenciando que el select muestra los resultado sin depender de que se finalice el update (Tomando en cuenta que puede obtener datos no reales o basura como he leido en muchos post pero ese es otro tema).

    3) Ejecuto nuevamente el update masivo y en la otra sesión el select incluido el with(nolock) evidenciando el mismo resultado que en el escenario 2.

    En base a lo detallado quisiera sus comentarios expertos de si existen diferencias en incluir en los select el (nolock) y el with(nolock) dado que según las pruebas y todo lo que he leído la única diferencia es que microsoft recomienda el cambio dado que a futuro podría quedar obsoleto el (nolock) sin el with pero en funcionamiento presenta el mismo comportamiento. 

    Me gustaría conocer todos sus comentarios, experiencias o consultas sobre el caso dado que de mi parte no se si es factible solventar el problema de bloqueos que dice existir el área de base de datos con el cambio de incluir el with en todos los select en los que tengan el (nolock).

    O yo estoy confundido dado que se le podría cambiar solo por el tema de compatibilidad con versiones futuras.

    De antemano gracias por todas sus respuestas.
    • Editado EcuaSQL sábado, 24 de agosto de 2019 17:09 redacción
    sábado, 24 de agosto de 2019 17:08

Todas las respuestas

  • Hola   EcuaSQL

     

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma,  te comparto a continuación los siguientes enlaces

    https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-query?view=sql-server-2017

    https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-table?view=sql-server-2017

    https://blogs.msdn.microsoft.com/davidlean/2009/04/05/sql-server-nolock-hint-other-poor-ideas/

     

    Gracias por usar los foros de MSDN.

     

    Pablo Rubio

     ____

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

     

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

     

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    • Propuesto como respuesta José Diz jueves, 29 de agosto de 2019 19:19
    miércoles, 28 de agosto de 2019 16:54
    Moderador
  • Ellos comentan que se evidencia que existen varias consultas dentro de procedimientos almacenados que tienen el (nolock) y que se debería cambiar por el with(nolock) para evitar los bloqueos.

    No hay diferencia entre usar
      (NOLOCK)
    o
      with (NOLOCK).

    ---

    Esto es lo que está escrito en la documentación de Sugerencias de tabla:

    Argumentos

    WITH ( <table_hint> ) [ [ , ]...n ]
    Con algunas excepciones, las sugerencias de tabla se admiten en la cláusula FROM únicamente cuando las sugerencias se especifican con la palabra clave WITH. Las sugerencias de tabla deben especificarse también con paréntesis.

    Las siguientes sugerencias de tabla se permiten con y sin la palabra clave WITH: NOLOCK, READUNCOMMITTED, UPDLOCK, REPEATABLEREAD, SERIALIZABLE, READCOMMITTED, TABLOCK, TABLOCKX, PAGLOCK, ROWLOCK, NOWAIT, READPAST, XLOCK, SNAPSHOT y NOEXPAND.

    Cuando estas sugerencias de tabla se especifican sin la palabra clave WITH, deben especificarse solas.

    ---

    Es como tú dices: según las pruebas y todo lo que he leído la única diferencia es que microsoft recomienda el cambio dado que a futuro podría quedar obsoleto el (nolock) sin el with pero en funcionamiento presenta el mismo comportamiento.

    ---

    A tiempo: utilizar la sugerencia de tabla NOLOCK no es una buena práctica: Bad habits : Putting NOLOCK everywhere 

        

    Si esta respuesta te ayudó a resolver tu problema, recuerda marcarla.


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz jueves, 29 de agosto de 2019 9:56
    jueves, 29 de agosto de 2019 9:45