Me encuentro con el siguiente problema tengo un sistema donde ejecuto un stored procedure que ingresa datos en la base sql server 2005, ahora la gente que esta implementando el sistema me dice que el store le bloquea las demás base o sea hasta que el store no se cierre ellos no pueden agregar u borrar datos en otras bases que están en ese mismo servidor sql. Quería saber si esto es así por que enunca escuche esto y si es así como puedo solucionarlo.
Acá hay que identificar dos cosas: - Si el sp no interactúa con las demás bases de datos no tiene porque bloquear otra base de datos, eso no es correcto. - Si el sp interactura a través de un linked server, o invoca paquetes que se resuelven en otras db puede darse el caso. Esta en ti que conoces la estructura de tu sp determinar si llama a otra bd o no. Puedes correr el sp y correr el comando sp_who active y ver el SPID de tu proceso y determinar que esta bloqueando.
Yo tengo un stored procedure que toma datos y los ingresa en una tabla acá te lo paso. CREATE PROCEDURE [dbo].[sp_cargar_depositoSUSS] AS begin SET NOCOUNT ON; SET DATEFORMAT YMD; /* Se carga el lote en la tabla AFIP, que tiene los mismos campos -Completo, aunque no se utilicen todos-. Se inserta en la tabla depositoSUSS la suma total por aseguradora de aquellas entradas de tipo 'C' (crédito) menos las de tipo 'D' (débito). Se agrupa por fecha de transferencia, período correspondiente y aseguradora. ¿Se verifica la relación entre empleador y aseguradora a la fecha de transferencia?... ¿Período pagado? Asumimos este último. Si existe fecha de baja, estimamos el corte a una fecha -en principio tomamos el 15 de cada mes */ INSERT INTO depositoSUSS SELECT newid(), aseguradora.idAseguradora, FECPROC, CASE WHEN PERIODO >= 8000 THEN '19' + substring(PERIODO, 1, 2) ELSE '20' + substring(PERIODO, 1, 2) END as anio, substring(PERIODO, 3, 4), sum(CASE WHEN INDDBCR LIKE 'C' THEN cast(substring(importe, 1, 13) + '.' + substring(importe, 14, 15) as money) ELSE cast('-' + substring(importe, 1, 13) + '.' + substring(importe, 14, 15) as money) END) FROM AFIP INNER JOIN empleador ON AFIP.CUITCONT = empleador.cuit INNER JOIN aseguradora_empleador ON convert(nvarchar(400), empleador.idEmpleador) = aseguradora_empleador.idEmpleador INNER JOIN aseguradora ON aseguradora_empleador.idAseguradora = convert(nvarchar(400), aseguradora.idAseguradora) WHERE (PERIODO >= 8000 AND (('19' + PERIODO > DATEPART(year, aseguradora_empleador.fechaAlta) + DATEPART(month, aseguradora_empleador.fechaAlta)) OR ('19' + PERIODO = DATEPART(year, aseguradora_empleador.fechaAlta) + DATEPART(month, aseguradora_empleador.fechaAlta)) AND (DATEPART(day, aseguradora_empleador.fechaAlta) < 14) ) AND ( aseguradora_empleador.fechaBaja IS NULL OR aseguradora_empleador.fechaBaja >= convert(datetime,('15/' + substring(PERIODO, 3, 4) + '/19' + substring(PERIODO, 1, 2)),103) ) ) OR (PERIODO < 8000 AND ( ('20' + PERIODO > DATEPART(year, aseguradora_empleador.fechaAlta) + DATEPART(month, aseguradora_empleador.fechaAlta)) OR ('20' + PERIODO = DATEPART(year, aseguradora_empleador.fechaAlta) + DATEPART(month, aseguradora_empleador.fechaAlta)) AND (DATEPART(day, aseguradora_empleador.fechaAlta) < 14) ) AND (aseguradora_empleador.fechaBaja IS NULL OR aseguradora_empleador.fechaBaja >= convert(datetime,('15/' + substring(PERIODO, 3, 4) + '/20' + substring(PERIODO, 1, 2)),103) ) ) GROUP BY aseguradora.idAseguradora, FECPROC, PERIODO -- DELETE DE LA TABLA AFIP END GO La gente que esta implementando el sistema me dice que al ejecutar el stored, hasta que este no termine deja en espera los demás stored, ya sea como agregar o borrar pero no solo los stored de esta base sino de las otras bases que se encuentran en este servidor, este stored no interactúa con las demás bases.
¿Aun sigues con este problema? He tenido mucho trabajo por lo que no he podido contestar.
Esto puede pasar por varias razones 1. La conexión en que ejecutas el sp no permite conexiones 2. El sp procesa demasiados datos y bloquea el sql server, no dejando procesar las demás peticiones 3. La memoria reservada el sql server no es suficiente (tendrías que cambiar los valores que vienen por default) y ampliarlos a tus necesidades Tendrías que depurar las operaciones que realiza el sp y revisar las conexión si la abre como optimistic o pessimistic así como también las opciones del cursor. Otra podría ser que si abre querys (SELECT) añadir la opción WITH (NOLOCK) por cada tabla que se consulta, esto en ocasiones provoca bloqueos en otras consultas Para finalizar tendrías que ejecutar un "ejecution plan" para ver en que parte tiene más tiempo de proceso y realizar una depuración de tu sp, para esto hay varias maneras, creando indices, trabajar con tablas temporales, crear vistas... etc., hay varias opciones pero tienes que determinar en que parte y/o porque se esta colgando el proceso del servidor.