gran bloqueo

04/05/2006 - 23:40 por Richard | Informe spam
Muchachos.

Hoy se produjo en la empresa un problema que afecto de manera
considerable la performance de sql. un usuario de otra ciudad tuvo
problemas con su computador el cual quedo colgado, en ese momento
estaba conectado a una base de datos, esto produjo que los usuarios se
bloquearan, ya que las transacciones que tenia tomada no permitía que
otras transacciones corrieran normalmente. Ante esta situación se me
solicito crear un procedimiento que me permita identificar los usuarios
cuyas transacciones duren un tiempo mas largo de lo comun. Alguien ha
leido o conoce la manera de obtener esta información u otro comentario
a como poder detectar rapidamente estos errores.

saludos.
 

Leer las respuestas

#1 Penta
05/05/2006 - 00:31 | Informe spam
Hola Richard.
El tiempo de duracion lo pones en la transaccion, ejemplo si es desde
VB ahi le ones cuando esperara para poder ejecutarse, de todas maneras
como eso no lo puedes ver de manera rapida, ya que tendrias que revisar
todo el codigo de la(s) aplicaciones, lo "normal" es ver quien tiene
tomada la base de datos:

set nocount on
declare @blocker_spid int, @blockee_spid int, @blockee_blocker int
declare @blockee_waitime int
IF EXISTS
(SELECT * FROM master.dbo.sysprocesses WHERE spid IN (SELECT
blocked FROM master.dbo.sysprocesses))
BEGIN
DECLARE blocker_cursor CURSOR FOR
SELECT spid FROM master.dbo.sysprocesses WHERE spid IN (SELECT blocked
FROM master.dbo.sysprocesses) AND blocked=0
DECLARE blockee_cursor CURSOR FOR
SELECT spid, blocked, waittime FROM master.dbo.sysprocesses WHERE
blocked > 0
OPEN blocker_cursor
FETCH NEXT FROM blocker_cursor INTO @blocker_spid
WHILE (@@FETCH_STATUS =0 )
BEGIN
Select 'Spid Bloqueador: ',@blocker_spid
exec sp_who @blocker_spid
exec sp_executesql N'dbcc inputbuffer(@Param)',N'@Param int',
@blocker_spid
OPEN blockee_cursor
FETCH NEXT FROM blockee_cursor INTO @blockee_spid,
@blockee_blocker, @blockee_waitime
WHILE (@@fetch_status = 0)
BEGIN
blocked = @blocker_spid
IF (@blockee_blocker=@blocker_spid)
BEGIN
SELECT 'Blockee: Waittime:', @blockee_spid, @blockee_waitime
exec sp_executesql N'dbcc inputbuffer(@Param)',N'@Param int',
@blockee_spid
END
FETCH NEXT FROM blockee_cursor INTO @blockee_spid,
@blockee_blocker, @blockee_waitime

END
CLOSE blockee_cursor
FETCH NEXT FROM blocker_cursor INTO @blocker_spid
END
CLOSE blocker_cursor
DEALLOCATE blockee_cursor
DEALLOCATE blocker_cursor
END
ELSE
SELECT 'No hay procesos bloqueados!' as Resultado
go
Dependiendo quien lo tiene bloqueado lo puedes "matar", tambien te
permite ver la sentencia.


Claro esto solo para casos como estos, la idea es que este bien
programada la aplicacion

Salu2.
Penta.





Richard ha escrito:

Muchachos.

Hoy se produjo en la empresa un problema que afecto de manera
considerable la performance de sql. un usuario de otra ciudad tuvo
problemas con su computador el cual quedo colgado, en ese momento
estaba conectado a una base de datos, esto produjo que los usuarios se
bloquearan, ya que las transacciones que tenia tomada no permitía que
otras transacciones corrieran normalmente. Ante esta situación se me
solicito crear un procedimiento que me permita identificar los usuarios
cuyas transacciones duren un tiempo mas largo de lo comun. Alguien ha
leido o conoce la manera de obtener esta información u otro comentario
a como poder detectar rapidamente estos errores.

saludos.

Preguntas similares