Un cliente ha informado de instancias repetidas de Comportamiento muy extraño al ejecutar un procedimiento almacenado.MS SQL Server 2005 - Procedimiento almacenado "Interrupciones espontáneas"
Tienen código que se ejecuta en una transposición en caché de un conjunto de datos volátil. Un procedimiento almacenado fue escrito para volver a procesar el conjunto de datos sobre la demanda si:
1. El conjunto de datos ha cambiado desde la última reprocesamiento
2. El datset ha permanecido inalterada durante 5 minutos
(La segunda condición se detiene el nuevo cálculo repetido masiva durante tiempos de cambio.)
Esto funcionó bien durante un par de semanas, el SP estaba tomando 1-2 segundos para completar la re-procesamiento, y sólo lo hicieron cuando sea necesario. Entonces ...
- El SP pronto "dejó de funcionar" (que sólo siguió corriendo y nunca regresó)
- Nos cambió el SP de una manera sutil y funcionó de nuevo
- Unos días más tarde se detuvo a trabajar de nuevo
- Alguien dijo entonces "hemos visto esto antes, simplemente volver a compilar el SP"
- sin ningún cambio en el código que vuelve a compilar el SP, y funcionó
- pocos días después que dejó de funcionar de nuevo
Esto se ha repetido muchas, muchas veces. El SP de repente "deja de funcionar", nunca regresa y el cliente agota el tiempo de espera. (Intentamos ejecutarlo a través de Management Studio y cancelamos la consulta después de 15 minutos.)
Sin embargo, cada vez que recompilamos el SP, de repente funciona de nuevo.
Todavía no he probado WITH RECOMPILE en las declaraciones apropiadas de EXEC, pero particularmente no quiero hacerlo de ninguna manera. Se llama cientos de veces por hora y normalmente no hace nada (solo reprocesa los datos unas pocas veces al día). Si es posible quiero evitar la sobrecarga de volver a compilar lo que es un SP relativamente complicado "sólo para evitar algo, que 'no debe' suceder ...
- Alguien ha experimentado esto antes?
- ¿alguien tiene alguna sugerencia sobre cómo superarlo?
Cheers,
Dems.
EDIT:
El código pseduo sería como sigue:
- lectura "a" de table_x
- leer "b" de table_x
- Si (a < b) devuelve
- iniciar la transacción
- BORRAR table_y
- INSERT INTO table_y < 3 selecciona unioned juntos>
- ACTUALIZACIÓN table_x
- confirmar la transacción
Los selecciona "no son bastante", pero cuando se ejecutan en línea ejecutan en poco tiempo. Incluyendo cuando el SP se niega a completar. Y el generador de perfiles muestra que es el INSERTO en el que el SP "bloquea"
No hay parámetros para el SP, y sp_lock no muestra nada que bloquee el proceso.
Me parece que tiene una transacción que no está siendo comprometida o revertida. Difícil de decir sin ver el código. – Juliet
Ah, y nunca está de más descargar los últimos service packs y ups. – Juliet
Debe ser un BLOQUEO, o al menos se comporta así ... – tekBlues