none
ADO.NET ¿Que pasa cuando hay un timeout en SQLCommand? RRS feed

  • Pregunta

  • Pues eso, supongamos que estoy haciendo un query pesado en SQL Server que tarda varios minutos desde ADO.Net y el timeout de mi SQLCommand se cumple lanzando esa excepción,

    • ¿Que pasa con la consulta se selección que estaba en ejecución en ese momento?¿Continua ejecutandose?¿Se cancela?
    • ¿Que pasa con las tablas #temporales creadas?
    • ¿Si es una consulta de inserción se pierden los datos insertados, solo se respetan los que se llevaban procesados?
    • ¿Si es de borrado, cual es el comportamiento?
    • ¿Que pasa con las consultas de actualización?
    • ¿Como debería de manejarse una consulta que pueda durar varios minutos? 

    De antemano agradesco su apoyo, un saludo.

    viernes, 11 de mayo de 2018 21:22

Respuestas

  • Hola Yamiel Dash:

    La solución para que una transaccion se revierta y se cierre la conexion y el pool de conexiones se libere y todo siga su curso normal, es que la consulta venga encabezada por un Set XACT_ABORT ON, que no es su valor por defecto.

    https://docs.microsoft.com/es-es/previous-versions/sql/sql-server-2012/ms188792(v=sql.110)

    Como este no es su valor por defecto, a partir de ahí el escenario es difícil.

    En principio el motor deja la consulta, no cierra la transaccion, no hace ni commit ni rollback, no elimina los bloqueos que haya establecido la misma y eliminará el hilo del pool de conexiones.

    https://dba.stackexchange.com/questions/10912/sql-server-transaction-timeout?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

    En resumidas cuentas, que lo deja, como esta.

    Si se deberían de manejar consultas de minutos, evidentemente eso depende de quien quiere la información, que normalmente será quien te la pide. Claramente es algo que ocurre a diario. Siempre puedes aumentar el tiempo de conexion remota. Y buscar la manera de obtener consultas, bien sea paginadas, o por bloques.

    En mi experiencia personal, cuando le mandas una consulta muy costosa en procesamiento, y pasa su tiempo de espera, y no ha resuelto.....se queda frito, tarda mucho tiempo en restablecerse, siendo a veces obligatorio reiniciar el servicio.

    Espero te sirva de ayuda.

    Un saludo

    • Marcado como respuesta Yamiel Dash lunes, 14 de mayo de 2018 3:14
    sábado, 12 de mayo de 2018 7:12

Todas las respuestas

  • Hola Yamiel Dash:

    La solución para que una transaccion se revierta y se cierre la conexion y el pool de conexiones se libere y todo siga su curso normal, es que la consulta venga encabezada por un Set XACT_ABORT ON, que no es su valor por defecto.

    https://docs.microsoft.com/es-es/previous-versions/sql/sql-server-2012/ms188792(v=sql.110)

    Como este no es su valor por defecto, a partir de ahí el escenario es difícil.

    En principio el motor deja la consulta, no cierra la transaccion, no hace ni commit ni rollback, no elimina los bloqueos que haya establecido la misma y eliminará el hilo del pool de conexiones.

    https://dba.stackexchange.com/questions/10912/sql-server-transaction-timeout?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

    En resumidas cuentas, que lo deja, como esta.

    Si se deberían de manejar consultas de minutos, evidentemente eso depende de quien quiere la información, que normalmente será quien te la pide. Claramente es algo que ocurre a diario. Siempre puedes aumentar el tiempo de conexion remota. Y buscar la manera de obtener consultas, bien sea paginadas, o por bloques.

    En mi experiencia personal, cuando le mandas una consulta muy costosa en procesamiento, y pasa su tiempo de espera, y no ha resuelto.....se queda frito, tarda mucho tiempo en restablecerse, siendo a veces obligatorio reiniciar el servicio.

    Espero te sirva de ayuda.

    Un saludo

    • Marcado como respuesta Yamiel Dash lunes, 14 de mayo de 2018 3:14
    sábado, 12 de mayo de 2018 7:12
  • Interesante estimado, esto lo pregunto porque estoy trabajando en un visor de logs para una aplicacion web, si bien se consultan intervalos de tiempo de no mas de 10 minutos, pueden haber hasta 5000 registros resultantes, lo que hace que dichas consultas sean lentas de procesar, por lo que me entro esta duda, de momento estoy optimizando las consultas lo mejor posible para evitar que los tiempos de respuesta superen el minuto, es por eso que me entro esta duda y como deberia manejarlo en caso de presentarse.

    Saludos.

    lunes, 14 de mayo de 2018 3:20
  • Pues como nota complementaria, en mi opinión, 5000 registros es nada para un servidor moderno de base de datos.  Si tarda más de 5 segundos en procesarlos, algo debe andar mal.

    Jose R. MCP
    Code Samples

    lunes, 14 de mayo de 2018 4:26
    Moderador