ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Listar query que ocasiou o locked

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
welington_quatro14
Aprendiz
Aprendiz


Registrado: Quinta-Feira, 26 de Julho de 2012
Mensagens: 137

MensagemEnviada: Ter Set 19, 2017 2:41 pm    Assunto: Listar query que ocasiou o locked Responder com Citação

Boa tarde.

Estou tentando alguns problemas de locked em alguns usuarios, e comecei a desenvolver um útil que lista as sessões e ids que alocam o banco por determinado tempo.

Via banco eu sei que pegando o ID da sessão e fazer o comando:
onstat -g sql "id" lista a ultima query executada na sessão.

Porém, eu preciso fazer isso via aplicação. Alguém tem alguma ideia?
Até o momento tenho isso:


Código:
procedure TfrmTimerLocked.ExecutaQuery;
var
  vQry: TQuery;
  vHandle: THandle;
begin
  try
    vQry := TQuery.Create(Application);
    vQry.DatabaseName := _DATABASENAME;
    try
      vQry.ParamCheck := False;
      vHandle := GetActiveWindow;
      with vQry do
      begin
        SQL.Clear;
        SQL.Add('drop table lcktab');
        try
          ExecSQL;
        except
        end;

        Close;
        SQL.Clear;
        SQL.Add('select a.us_sid wsid, a.us_name wname, d.us_sid osid, d.us_name oname');
        SQL.Add('  from sysmaster:sysuserthreads a, sysmaster:systxptab b, sysmaster:syslcktab c, sysmaster:sysuserthreads d');
        SQL.Add(' where sysmaster:bitval(a.us_flags,"0x4") = 1');
        SQL.Add('   and a.us_lkwait = c.address');
        SQL.Add('   and c.owner = b.address');
        SQL.Add('   and b.owner = d.us_address');
        SQL.Add('  into temp lcktab');
        ExecSQL;

        SQL.Clear;
        SQL.Add('drop table lcktab2');
        try
          ExecSQL;
        except
        end;

        SQL.Clear;
        SQL.Add('select b.osid, b.wsid bwsid, a.wsid awsid');
        SQL.Add('  from lcktab b left outer join lcktab a');
        SQL.Add('    on a.osid = b.wsid');
        SQL.Add(' order by 1');
        SQL.Add('  into temp lcktab2');
        ExecSQL;

        SQL.Clear;
        SQL.Add('select osid session, bwsid waitlist, awsid');
        SQL.Add('  from lcktab2');
        SQL.Add(' where awsid is not null');
        SQL.Add('    or (( awsid is null) and (bwsid not in');
        SQL.Add('        (select awsid from lcktab2 where awsid is not null)))');
        Open;

        if (not vQry.IsEmpty) then
        begin
          First;
          while (not vQry.Eof) do
          begin
            mmTimer.Lines.Add('Data: ' + DateTimeToStr(Now));
            mmTimer.Lines.Add('Session: ' + vQry.FieldByName('session').AsString);
            mmTimer.Lines.Add('Waitlist: ' + vQry.FieldByName('waitlist').AsString);
            mmTimer.Lines.Add('Awsid: ' + vQry.FieldByName('awsid').AsString);
            mmTimer.Lines.Add(EmptyStr);
            Next;
          end;
        end;

        {Display # of locks held by session}
        SQL.Clear;
        SQL.Add('select osid session, count(osid) locks');
        SQL.Add('  from lcktab2');
        SQL.Add(' where awsid is not null');
        SQL.Add('    or ((awsid is null)');
        SQL.Add('   and (bwsid not in');
        SQL.Add('       (select awsid');
        SQL.Add('          from lcktab2');
        SQL.Add('         where awsid is not null)))');
        SQL.Add(' group by osid');;
        Open;

        if (not vQry.IsEmpty) then
        begin
          First;
          while (not vQry.Eof) do
          begin
            mmTimer.Lines.Add('Data: ' + DateTimeToStr(Now));
            mmTimer.Lines.Add('Session: ' + vQry.FieldByName('session').AsString);
            mmTimer.Lines.Add('Locks: ' + vQry.FieldByName('locks').AsString);
            mmTimer.Lines.Add(EmptyStr);
            Next;
          end;
        end;
      end;

      mmTimer.Lines.Add(DateTimeToStr(Now) + ' - Em execução ...');

    finally
      FreeAndNil(vQry);
    end;
  except
    on E: Exception do
    begin
      mmTimer.Lines.Add('ERRO: ExecutaQuery');
      tmrLocked.Enabled := False;
      raise ETraceException.Create('TfrmTimerLocked.ExecutaQuery', E);
    end;
  end;
end;


Com isso, consigo o ID e a sessão que alocou no banco de dados.
Agora quero listar a query que alocou, assim que der lock no banco de dados.

Alguém pode me ajudar?

Muito obrigado a todos, desde já.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB