none
Identificar Evento de transação aberta RRS feed

  • Pergunta

  • Boa tarde!

    Gostaria de saber de que forma consigo identificar o EventInfo de uma transação aberta e que esta em estado de "Sleeping". Por exemplo:

    Tenho uma aplicação que abre varias transações em meu banco de dados porem, algumas ficam muito tempo em Sleeping e ao executar um dbcc inputbuffer o resultado que tenho é o seguinte:

    EventType| Parameter | EventInfo

    No Event           0              NULL

    Saberiam me dizer algum método, fora o profile, para eu identificar o conteúdo dessa transação?

    quarta-feira, 5 de abril de 2017 18:51

Respostas

  • Boa tarde Wender.

    Isso pode ser uma caracteristica do comportamento de connection pooling da aplicação.

    Tenho um vídeo que fala um pouco sobre isso, se ajudar.

    https://blogdojamal.wordpress.com/2017/02/15/connection-pooling-x-dba-meu-primeiro-video/

    Normalmente mesmo no pool de conexões ela tem um tempo de vida útil se não forem reutilizadas, você conseguirá ver esses eventos via Xe ou profiler.

    Atenciosamente

    Reginaldo Silva

    quinta-feira, 6 de abril de 2017 20:02
  • Wender,

    Acredito que estas DMVs podem te ajudar:

    • sys.dm_exec_query_stats
    • sys.dm_exec_sql_text
    • sys.dm_tran_session_transactions
    • sys.dm_exec_requests

    Veja se este exemplo pode te retornar informações úteis:

    Declare @Contador Int
    
    Set @Contador=0
    
    Begin Transaction T1
    
    While @Contador <=10000000
     Begin
    
       Begin Transaction T2
        Print Convert(Varchar(10),@Contador)
        Set @Contador +=1 
       Commit Transaction T2     
       
     End 
    
    Commit Transaction T1
    
    SELECT s.session_id, s.login_name, s.host_name, 
                s.program_name, s.status, s.last_request_start_time, 
                s.last_request_end_time,             
                r.command,
                r.open_transaction_count As 'Quantidade Transações Abertas'
    FROM sys.dm_exec_sessions AS s Inner Join sys.dm_exec_requests r
                                                              On s.session_id = r.session_id
    WHERE EXISTS (SELECT session_id FROM sys.dm_tran_session_transactions AS t WHERE t.session_id = s.session_id)
    AND EXISTS (SELECT session_id FROM sys.dm_exec_requests AS r WHERE r.session_id = s.session_id)
    Order By s.login_name;


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sábado, 8 de abril de 2017 14:29
    Moderador

Todas as Respostas

  • Boa tarde Wender.

    Isso pode ser uma caracteristica do comportamento de connection pooling da aplicação.

    Tenho um vídeo que fala um pouco sobre isso, se ajudar.

    https://blogdojamal.wordpress.com/2017/02/15/connection-pooling-x-dba-meu-primeiro-video/

    Normalmente mesmo no pool de conexões ela tem um tempo de vida útil se não forem reutilizadas, você conseguirá ver esses eventos via Xe ou profiler.

    Atenciosamente

    Reginaldo Silva

    quinta-feira, 6 de abril de 2017 20:02
  • Wender,

    Acredito que estas DMVs podem te ajudar:

    • sys.dm_exec_query_stats
    • sys.dm_exec_sql_text
    • sys.dm_tran_session_transactions
    • sys.dm_exec_requests

    Veja se este exemplo pode te retornar informações úteis:

    Declare @Contador Int
    
    Set @Contador=0
    
    Begin Transaction T1
    
    While @Contador <=10000000
     Begin
    
       Begin Transaction T2
        Print Convert(Varchar(10),@Contador)
        Set @Contador +=1 
       Commit Transaction T2     
       
     End 
    
    Commit Transaction T1
    
    SELECT s.session_id, s.login_name, s.host_name, 
                s.program_name, s.status, s.last_request_start_time, 
                s.last_request_end_time,             
                r.command,
                r.open_transaction_count As 'Quantidade Transações Abertas'
    FROM sys.dm_exec_sessions AS s Inner Join sys.dm_exec_requests r
                                                              On s.session_id = r.session_id
    WHERE EXISTS (SELECT session_id FROM sys.dm_tran_session_transactions AS t WHERE t.session_id = s.session_id)
    AND EXISTS (SELECT session_id FROM sys.dm_exec_requests AS r WHERE r.session_id = s.session_id)
    Order By s.login_name;


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sábado, 8 de abril de 2017 14:29
    Moderador