none
Interbloqueo con múltiples datasets RRS feed

  • Pregunta

  • Buenos días foro, estoy utilizando reporting services 2008 y tengo un reporte que ejecuta dos datasets. El problema es que las consultas de estos datasets recaen sobre las mismas tablas y al ejecutar el reporte se producen interbloqueos que demoran más de la cuenta el mismo. Tengo forma de configurar el reporte para que ejecute consecutivamente los dos datasets y no de manera conjunta? O si esto no es posible...puedo desencadenar la ejecución del segundo dataset al realizar algún evento sobre el reporte? Imagino que debe ser un caso común el que planteo, si existe alguna otra opción (que no sea unificar los datasets, eso no es viable) me gustaría que lo comentaran. Desde ya muchas gracias por la ayuda. Saludos.
    lunes, 15 de diciembre de 2014 4:36

Respuestas

  • ¿Seguro que son interbloqueos? ¿No será más bien que los bloqueos hacen lenta la consulta? Un interbloqueo produce un error que hace que no se ejecute la consulta. Pero tú dices que va lenta. Si fuera un interbloqueo el informe no se mostraría.

    Bien es cierto que una instrucción select puede recibir un error de interbloqueo, pero éste no puede ser causada por otra instrucción select, tiene que ser por otras instrucciones que modifiquen los datos como insert, update o delete.

    Por otra parte para evitar errores de interbloqueos en instrucciones select, o lentitud causada por bloqueos, una solución es usar un nivel de aislamiento del tipo snapshot, como READ COMMITTED SNAPSHOT, y SNAPSHOT. Estos niveles de aislamiento hay que habilitarlos a nivel de base de datos. Habilitar READ COMMITTED SNAPSHOT en la base de datos puede ser en algunos casos raros un poco problemático porque cambia el nivel de aislamiento predeterminado de READ COMMITTED a READ COMMITTED SNAPSHOT. Sin embargo yo estoy harto de usar ese nivel de aislamiento y no he tenido problemas de ninguna clase hasta ahora. De hecho todas nuestras bases de datos tienen habilitado este nivel de aislamiento. Tanto nos gusta este nivel de aislamiento que la base de datos model tiene este nivel, de manera que cualquier base de datos que creamos lo tiene.

    Para usar el nivel de aislamiento SNAPSHOT tienes que habilitarlo en la base de datos y además especificarlo de forma explícita cuando quieras usarlo. Si tu informe está basado en procedimientos almacenados es fácil establecerlo:

    CREATE PROCEDURE MyReport
    AS
      SET TRANSACTION ISOLATION LEVEL SNAPSHOT
    
      SELECT .....
      FROM ...
      WHERE ...
    
      SET TRANSACTION ISOLATION LEVEL READ COMMITTED

    Para usar el nivel de aislamiento READ COMMITTED SNAPSHOT solo hay que habilitarlo en la base de datos, no hay que hacer nada más, pero como he dicho antes, existe un pequeño riesgo de que algo por ahí no funcione como antes.



    Jesús López


    EntityLite a lightweight, database first, micro orm

    • Marcado como respuesta DaviT Cba lunes, 15 de diciembre de 2014 13:03
    lunes, 15 de diciembre de 2014 10:02

Todas las respuestas

  • No deberían producirse interbloqueos. En principio para construir los datasets solo se necesita leer datos, y los bloqueos de lectura son compatibles entre sí, por lo que una lectura no debería bloquear (y mucho menos interbloquear) a otra lectura. Tiene que estar sucediendo algo extraño que no es evidente únicamente con los datos que aportas. Prueba a usar el Profiler con la plantilla de Locking para capturar las sentencias que está enviando SSRS, y examina las sentencias que le llegan, a ver en qué orden suceden y si realmente se están solapando los datasets. Y si se produce el interbloqueo, examina el diagrama de interbloqueos producido por el Profiler, a ver quién está bloqueando a quién. Sospecho que encontrarás que se produce debido a un conflicto con algún otro programa que también está accediendo a las tablas al mismo tiempo.
    • Propuesto como respuesta Willams Morales lunes, 15 de diciembre de 2014 7:39
    lunes, 15 de diciembre de 2014 6:14
    Moderador
  • ¿Seguro que son interbloqueos? ¿No será más bien que los bloqueos hacen lenta la consulta? Un interbloqueo produce un error que hace que no se ejecute la consulta. Pero tú dices que va lenta. Si fuera un interbloqueo el informe no se mostraría.

    Bien es cierto que una instrucción select puede recibir un error de interbloqueo, pero éste no puede ser causada por otra instrucción select, tiene que ser por otras instrucciones que modifiquen los datos como insert, update o delete.

    Por otra parte para evitar errores de interbloqueos en instrucciones select, o lentitud causada por bloqueos, una solución es usar un nivel de aislamiento del tipo snapshot, como READ COMMITTED SNAPSHOT, y SNAPSHOT. Estos niveles de aislamiento hay que habilitarlos a nivel de base de datos. Habilitar READ COMMITTED SNAPSHOT en la base de datos puede ser en algunos casos raros un poco problemático porque cambia el nivel de aislamiento predeterminado de READ COMMITTED a READ COMMITTED SNAPSHOT. Sin embargo yo estoy harto de usar ese nivel de aislamiento y no he tenido problemas de ninguna clase hasta ahora. De hecho todas nuestras bases de datos tienen habilitado este nivel de aislamiento. Tanto nos gusta este nivel de aislamiento que la base de datos model tiene este nivel, de manera que cualquier base de datos que creamos lo tiene.

    Para usar el nivel de aislamiento SNAPSHOT tienes que habilitarlo en la base de datos y además especificarlo de forma explícita cuando quieras usarlo. Si tu informe está basado en procedimientos almacenados es fácil establecerlo:

    CREATE PROCEDURE MyReport
    AS
      SET TRANSACTION ISOLATION LEVEL SNAPSHOT
    
      SELECT .....
      FROM ...
      WHERE ...
    
      SET TRANSACTION ISOLATION LEVEL READ COMMITTED

    Para usar el nivel de aislamiento READ COMMITTED SNAPSHOT solo hay que habilitarlo en la base de datos, no hay que hacer nada más, pero como he dicho antes, existe un pequeño riesgo de que algo por ahí no funcione como antes.



    Jesús López


    EntityLite a lightweight, database first, micro orm

    • Marcado como respuesta DaviT Cba lunes, 15 de diciembre de 2014 13:03
    lunes, 15 de diciembre de 2014 10:02
  • Perdón, fué un error de concepto mío, no eran interbloqueos, las consultas quedaban suspendidas por el motor, cambié las opciones de multithread de la instancia y comenzó a funcionar mejor. Muchas gracias por las respuestas.
    lunes, 15 de diciembre de 2014 13:03