2011-04-27 23 views
9

Digamos que tengo una consulta que se envía a la base de datos de mi servidor SQL, lleva más de 30 segundos y mi programa arroja una excepción de tiempo de espera de consulta SQL. ¿La consulta sigue avanzando en mi base de datos o se cancela tan pronto como se lanza la excepción?¿Qué sucede con una consulta si se agota el tiempo?

Respuesta

14

Un cliente indica un tiempo de espera de consulta a el servidor mediante un evento atención. Un evento de atención es simplemente un tipo distinto de paquete TDS que un cliente de servidor SQL puede enviarle. En además de conectar/desconectar, T-SQL por lotes, y eventos RPC, un cliente puede llamar al . Una atención le dice al servidor que cancele la conexión actualmente en ejecución consulta (si hay una) tan pronto como posible. Una atención hace transacciones abiertas no rollback, y no detiene el consulta que se está ejecutando en un centavo - el servidor aborta lo que estaba haciendo para la conexión en la próxima oportunidad disponible . Generalmente, esto ocurre bastante rápido, pero no siempre.

Fuente There's no such thing as a query timeout...

1

Si obtiene un tiempo de espera SQL, SQL se ha detenido, sin embargo, las aplicaciones web pueden agotar el tiempo de espera y la consulta SQL puede continuar.

1

Antes de ejecutar una consulta, SQL Server estimaciones de la cantidad de memoria que necesita para plazo y trata de reservar esta cantidad de la memoria de la agrupación de almacenamiento intermedio. Si la reserva se realiza correctamente, la consulta es ejecutada inmediatamente. Si no hay memoria suficiente disponible desde el grupo de búferes, la consulta se pone en una cola con un valor de tiempo de espera, donde el valor de tiempo de espera es guiado por el costo de consulta. La regla básica es: mayor es el costo estimado, mayor el valor de tiempo de espera es. Cuando el tiempo de espera de esta consulta excede el valor de tiempo de espera , se genera un error de tiempo de espera y la consulta se elimina de la cola.

Source

+0

La mención de 30 segundos en la pregunta indica que el OP está preguntando sobre los tiempos de espera de los comandos (del cliente), no sobre los tiempos de espera de la concesión de la memoria o los tiempos de espera de bloqueo. –

+0

El tiempo de espera de concesión de memoria es diferente del tiempo de espera de solicitud de cliente ADO.Net, que es los 30 segundos a los que se refiere el OP –

-3

lo general, cuando el tiempo de espera significa que la conexión ha muerto, es decir, la consulta no ha sido enviado a la base de datos, la mayoría de las operaciones de apoyo a la base de datos donde se puede iniciar una transacción, ejecutar sus consultas, y si eres feliz, puedes cometerlos.

Ejemplo:

BEGIN TRAN 

UPDATE authors 
    SET au_fname = 'John' 
WHERE au_id = '172-32-1176' 

UPDATE authors 
    SET au_fname = 'Marg' 
WHERE au_id = '213-46-8915' 

COMMIT TRAN 
+0

En este caso, la conexión sigue abierta, pero la base de datos está cargada, lo que provoca consultas tomar un largo tiempo. – sooprise

+0

¿Estás hablando de tiempo de espera de conexión o algo así? Eso es diferente del tiempo de espera del comando. –

+0

Mi punto es que si él hace conexiones a un servidor y necesita asegurarse de que vayan a la base de datos real, el uso de transacciones ayudará a prevenir errores que a veces pueden ser causados ​​por el tiempo de espera – RobertPitt

2

Cuando el cliente decide que el comando se ha ejecutado tiempo suficiente, se emite un "Cancelar". La consulta simplemente deja de ejecutarse en la base de datos.

Cualquier bloque CATCH no se activará, las transacciones se dejarán abiertas y las bloqueos aún pueden permanecer asignadas después de esto, incluso si la conexión se cierra porque "cerrar" significa "volver al grupo de conexiones".

Si esperas un montón de tiempo de espera de comando y luego considerar el uso de SET XACT_ABORT ON (and this too) que se cerraduras de liberación y retrotraer transacciones. o corrige el código ...

+0

Usted dijo "La consulta simplemente deja de ejecutarse en la base de datos"; La respuesta de Martin Smith decía que "no detiene la consulta que se está ejecutando actualmente en un centavo: el servidor aborta lo que estaba haciendo para la conexión en la próxima oportunidad disponible". ¿Cual es correcta? – simonp

+0

Mismo resultado, idioma diferente. Mi "stop" puede retrasarse en función de la carga del servidor, IO en vuelo, lo que WAIT esté en juego, etc. – gbn

Cuestiones relacionadas