Welcome to Sign in | Help

Re: Blocaje

  •  11-04-2008, 11:21 AM

    Re: Blocaje

    Intru si eu in discutie, poate cu ocazia asta ma mai lamuresc. Tot probleme cu blocaje pe un server SQL 2005. Dupa indelungi cautari si incercari am facut o procedura stocata care imi returneaza informatii despre cine blocheaza si pe cine blocheaza. Problema e ca nu reusesc sa adaptez procedura sa vad exact ce parametri sunt folositi. Dau un exemplu:
    Query1:
    create table ##TblTest (SomeColumn int)
    go
    begin transaction
    insert into ##TblTest (SomeColumn) values (1)

    waitfor delay '0:01:40' /* hold the transaction open for 40 seconds */
    go
    commit transaction

    Query2:
    SELECT * FROM ##tblTest WHERE somecolumn=1

    La rularea procedurii imi apare ca primul query il blocheaza pe al doilea.Folosing sys.dm_exec_sql_text imi la al doilea proces imi afiseaza query-ul ca fiind:
    (@1 tinyint)SELECT * FROM [##tblTest] WHERE [somecolumn]=@1
    Deci, nu stiu ce valoare are @1. Am incercat si cu Inputbuffer dar tot nu afiseaza ce se intampla pentru cazurile 'real life' de ex, cand se salveaza o factura, se executa o procedura... totul e cu parametri @x

    Atasez procedura poate aveti mai multa inspiratie:

    Create PROCEDURE [dbo].[sp_GetBlockingStatus]
    AS

    BEGIN
    SET NOCOUNT ON;

    WITH Blocking(SPID, SPIDCareBlocheaza, Query, RowNo, LevelRow)
    AS
    (
    SELECT s.SPID,
    s.BlockingSPID,
    s.Definition,
    ROW_NUMBER() OVER(ORDER BY s.SPID),
    0 AS LevelRow
    FROM (SELECT s.spid, BlockingSPID = s.blocked, DatabaseName = DB_NAME(s.dbid),
    s.program_name, s.loginame, ObjectName = OBJECT_NAME(objectid,s.dbid),
    Definition = CAST(text AS VARCHAR(MAX))
    FROM sys.sysprocesses s CROSS APPLY sys.dm_exec_sql_text (sql_handle)
    WHERE s.spid > 50 ) s
    JOIN
    (SELECT s.spid, BlockingSPID = s.blocked, DatabaseName = DB_NAME(s.dbid),
    s.program_name, s.loginame, ObjectName = OBJECT_NAME(objectid,s.dbid),
    Definition = CAST(text AS VARCHAR(MAX))
    FROM sys.sysprocesses s CROSS APPLY sys.dm_exec_sql_text (sql_handle)
    WHERE s.spid > 50 ) s1 ON s.SPID = s1.BlockingSPID
    WHERE s.BlockingSPID = 0
    UNION ALL
    SELECT r.SPID,
    r.BlockingSPID,
    r.Definition,
    d.RowNo,
    d.LevelRow + 1
    FROM (SELECT s.spid, BlockingSPID = s.blocked, DatabaseName = DB_NAME(s.dbid),
    s.program_name, s.loginame, ObjectName = OBJECT_NAME(objectid,s.dbid),
    Definition = CAST(text AS VARCHAR(MAX))
    FROM sys.sysprocesses s CROSS APPLY sys.dm_exec_sql_text (sql_handle)
    WHERE s.spid > 50 ) r
    JOIN Blocking d ON r.BlockingSPID = d.SPID
    WHERE r.BlockingSPID > 0
    )
    SELECT SPID, SPIDCareBlocheaza, Query, RowNo, LevelRow FROM Blocking
    ORDER BY RowNo, LevelRow
    END
View Complete Thread
Powered by Community Server (Commercial Edition), by Telligent Systems