Pular para o conteúdo
  • Este tópico contém 2 respostas, 3 vozes e foi atualizado pela última vez 16 anos, 8 meses atrás por David Siqueira.
Visualizando 3 posts - 1 até 3 (de 3 do total)
  • Autor
    Posts
  • #88172
    RomuloRDM
    Participante

      Bom dia,

      Estou com um problema em uma aplicação em que trava duas tabelas e como são tabela de saldos (contabil) logo em seguida vai bloqueando varios usuarios, existe alguma forma de fazer um rastreamento pelo oracle para que eu possa identificar qual o usuario que está gravando nesta tabela?, Também verifiquei que nestas situações não apresenta lock de tabelas e o que acontece e que os usuarios que ficam aguardando estão usando o mesmo comando.

      Desde já agradeço a atenção.

      Att.

      RomuloRDM

      #88173
      jspaulonci
      Participante

        Bom dia Romulo, já algumas situações peculiares referente a esses assuntos, bom…vamos lá

        Eu começaria com o seguinte comando,

        select a.command,
        a.sid,
        a.serial#,
        a.username,
        b.owner,
        a.status,
        a.osuser,
        b.object,
        b.type,
        a.sql_address
        from V$session a, v$access b
        where a.sid = b.sid
        — and b.sid in (267)
        and b.object in (‘NOME_DA_TABELA’)

        Execute essa query (sugiro com DBA), você saberá quais sessões estão utilizando esta tabela, isso não quer dizer que ela estará bloqueada.
        (se você está em RAC, rode essa query para cada sessão, eu ainda não adequei todas a minha querys para RAC)

        Rode essa query se você não usa RAC
        select distinct (a.holding_session) SID_BLOQUEANDO,
        a.waiting_session SID_EM_ESPERA,
        c.username OWNER,
        c.machine MAQUINA,
        c.program APLICACAO,
        b.seconds_in_wait / 60 TEMPO_BLOQUEIO
        from dba_waiters a,
        v$session_wait b,
        v$session c
        where a.waiting_session = b.sid
        and b.sid = c.sid
        and a.mode_held like ‘Exclusive’

        Nessa query vc descobrirá se tem sessões aguardando outras sessões liberarem recursos

        Esse query , tem a mesa funcionalidade porem execute-a se seu ambiente é RAC

        select to_char(a.inst_id,’9′) “INST ESPERANDO”,
        a.sid as “SID ESPERANDO”,
        substr(a.username,1,15) usr_blk,
        substr(a.blocking_session_status,1,10) status,
        to_char(a.blocking_instance,’9′) “INST BLOQUEANDO”,
        a.blocking_session AS “SID BLOQUEANDO”,
        (select substr(username,1,15) from gv$session
        where sid = a.blocking_session
        and inst_id = a.blocking_instance) usr
        from gv$session a
        where a.blocking_session is not null

        Não esqueça de postar o resultado

        Abraços

        João Paulo Spaulonci

        #88176
        David Siqueira
        Participante

          Opa!!..salve, no meu BLOG tem alguma coisa sobre esse assunto cara, depois se tu quiser da uma passada lá, mais aqui fica meu script que uso sempre pra monitorar locks :

          set echo off
          set feedback on
          set linesize 1000
          col sid format 99999
          col serial format 99999
          col username format a20
          col osuser format a10
          col owner format a10
          col object_name format a30
          col machine format a15
          col program format a35
          col lockmode format a10

          prompt ----Sessions and objects involved in the locks

          Select distinct s.sid,s.serial#,
          s.username,
          s.status,
          s.osuser,
          p.spid "OS Pid",
          o.object_name,
          decode(l.locked_mode,
          0, 'None',
          1, 'Null',
          2, 'Row-S',
          3, 'Row-X',
          4, 'Share',
          5, 'S/Row-X',
          6, 'Exclusive',
          to_char(l.locked_mode)) "LockMode",
          s.lockwait,
          s.program,
          s.taddr
          from dba_objects o ,
          v$locked_object l,
          v$session s,
          v$process p,
          v$sqltext t
          where l.object_id=o.object_id
          and l.session_id = s.sid
          and s.paddr = p.addr
          and t.address = s.sql_address
          and t.hash_value = s.sql_hash_value
          order by sid,serial#;

          prompt ----SQL statements sessions currently executing

          Select distinct s.sid,
          s.serial#,
          p.spid "O.S|Id",
          t.piece,
          t.sql_text
          from dba_objects o ,
          v$locked_object l,
          v$session s,
          v$process p,
          v$sqltext t
          where l.object_id=o.object_id
          and l.session_id = s.sid
          and s.paddr = p.addr
          and t.address = s.sql_address
          and t.hash_value = s.sql_hash_value
          order by sid,serial#;

          Abraço, boa sorte!!!

        Visualizando 3 posts - 1 até 3 (de 3 do total)
        • Você deve fazer login para responder a este tópico.