tiempo superado expiró espera ejemplos consultas consulta complejas aumentar sql-server testing timeout locking

sql-server - expiró - se ha superado el tiempo de espera de la consulta sql server



Forzar un tiempo de espera de consulta en SQL Server (4)

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 bloqueo 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 bloqueo? Cualquier entrada es apreciada.


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 inyección de dependencia. Algunas cosas son difíciles de probar para la integración. Prueba unitaria + inyección de dependencia .

  • 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.



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

WaitFor Delay ''00:01:00''


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