Forzar un tiempo de espera de consulta en SQL Server

Hemos tenido un problema con un bloque de código que responde mal frente a bases de datos lentas (se cae en la cama en un tiempo de espera de consulta). Hemos creado un parche y estamos en proceso de ejecutarlo mediante regresión.

No podemos obtener un tiempo de espera. Abrí una transacción de SQL Mgmt Studio y actualicé cada fila para bloquearlos, pero eso no hace que INSERT agote el tiempo de espera (que es lo que necesito).

¿Puedo obtener un locking a nivel de tabla fácilmente a través de T-SQL? ¿O tengo que jugar con el maestro? ¿O puedo forzar fácilmente el tiempo de espera sin locking? Cualquier entrada es apreciada.

ejecuta esto y luego prueba tu inserción …

select * from yourTable with (holdlock,tablockx) 

aquí, puedes bloquearlo por 5 minutos:

 BEGIN TRANSACTION SELECT * FROM yourTable WITH (TABLOCKX, HOLDLOCK) WHERE 0 = 1 WAITFOR DELAY '00:05' ROLLBACK TRANSACTION 

Simplemente puede decirle a su código sql que espere un minuto antes de regresar:

 WaitFor Delay '00:01:00' 

En el lado de la punta: si la conexión es configurable, reduzca el tiempo de espera de la cadena de conexión a 1 segundo, eso lo hará más fácil. Llene la tabla con montones de datos y haga que otros 3 procesos giren en un ciclo actualizando los fragmentos de esa tabla con una transacción alrededor del ciclo. No modifique el procedimiento real invocado por la aplicación (inyectando waitfor). Eso invalida una prueba de integración.

Pero en realidad, este es un caso de estudio a favor de las pruebas unitarias y la dependency injection. Algunas cosas son difíciles de probar para la integración. Prueba unitaria + dependency injection .

  • Real: código que craps -> Tiempo de espera de la base de datos (difícil de reproducir).
  • Refactor: Código que craps -> Repositorio (solo acceso a datos) -> Base de datos
  • Prueba unitaria: Código que craps> Mock repository to throw -> null
  • Ahora tiene una prueba fallida para el código que craps y puede arreglarlo.

Esta es una inyección de “dependencia”. El desarrollador puede inyectar la dependencia a la base de datos, sustituyendo algo que simula el comportamiento de una dependencia. Es bueno hacerlo para todas las pruebas de bases de datos. De todos modos, con la prueba de la unidad en su lugar, sabrá que la solución funciona como debería, pero aún necesita una prueba de integración. En este caso, puede centrarse mejor en la regresión, lo que significa que probarla no rompió ninguna otra cosa y la función aún funciona.

Ya has creado tu parche, así que supongo que mi respuesta es demasiado tarde.

Mira esta publicación en el blog. Básicamente SQL Server no tiene tiempos de espera de consulta. Los clientes pueden exigir un tiempo de espera de SQL pero el motor no lo hace.

http://blogs.msdn.com/khen1234/archive/2005/10/20/483015.aspx