Pular para o conteúdo
Visualizando 8 posts - 1 até 8 (de 8 do total)
  • Autor
    Posts
  • #101789
    davidfs
    Participante

      Boa tarde à todos,

      Como o próprio titulo do tópico já diz, quero saber qual registro esta em lock. Com um porém, sei de qual objeto este registro faz parte e sei também qual a rowid do registro. Mas não sei como fazer a verificação se este determinado registro está travado.

      Agradeço deste de já, Obrigado.

      #101792
      vieri
      Participante

        SELECT substr(DECODE(request,0,’Holder: ‘,’Waiter: ‘)||sid,1,12) sess,
        id1, id2, lmode, request, type, inst_id
        FROM GV$LOCK
        WHERE (id1, id2, type) IN
        (SELECT id1, id2, type FROM GV$LOCK WHERE request>0)
        ORDER BY id1, request;

        aqui mostrará o usuário bloqueado e quem tá bloqueando.

        select do.owner
        , do.object_name
        , row_wait_obj#
        , row_wait_file#
        , row_wait_block#
        , row_wait_row#
        , dbms_rowid.rowid_create (1, ROW_WAIT_OBJ#, ROW_WAIT_FILE#,
        ROW_WAIT_BLOCK#, ROW_WAIT_ROW#)
        from gv$session s
        , dba_objects do
        where sid=899
        and s.ROW_WAIT_OBJ# = do.OBJECT_ID
        /

        aqui vc pega os rowid’s bloqueados pelo sid que está bloqueado ou que desejar.

        select * from table where rowid = (rowid);

        aqui o sql fala por sí.

        #101795
        davidfs
        Participante

          [quote=”vieri”:3lz2pshu]SELECT substr(DECODE(request,0,’Holder: ‘,’Waiter: ‘)||sid,1,12) sess,
          id1, id2, lmode, request, type, inst_id
          FROM GV$LOCK
          WHERE (id1, id2, type) IN
          (SELECT id1, id2, type FROM GV$LOCK WHERE request>0)
          ORDER BY id1, request;

          aqui mostrará o usuário bloqueado e quem tá bloqueando.

          select do.owner
          , do.object_name
          , row_wait_obj#
          , row_wait_file#
          , row_wait_block#
          , row_wait_row#
          , dbms_rowid.rowid_create (1, ROW_WAIT_OBJ#, ROW_WAIT_FILE#,
          ROW_WAIT_BLOCK#, ROW_WAIT_ROW#)
          from gv$session s
          , dba_objects do
          where sid=899
          and s.ROW_WAIT_OBJ# = do.OBJECT_ID
          /

          aqui vc pega os rowid’s bloqueados pelo sid que está bloqueado ou que desejar.

          select * from table where rowid = (rowid);

          aqui o sql fala por sí.[/quote]

          Obrigado Vieri, mais até ai eu havia chego o problema é que o rowid que traz não bate com o que esta realmente travado.

          Mais Alguma dica?

          #101800
          vieri
          Participante

            as vezes não bate mesmo….

            pois depende de como está implementado o proceso que bloqueia a linha.

            #101808
            davidfs
            Participante

              O que fazer então..

              “QUERY NOSSA QUE ESTAIS NO BANCO,
              RODE RÁPIDO MINHA CONSULTA,
              ASSIM NO CONSOLE QUANTO NA APLICAÇÃO
              QUE RETORNE NOSSA CONSULTA
              AMÉM!”

              #101809
              fabiogalera
              Participante

                Tenta fazer de um modo diferente

                Pegue o valor que está lockado, na coluna ROW_WAIT_OBJ#, e inclua abaixo:

                select object_name, object_type, object_id, data_object_id
                from dba_objects where object_id = &ID;

                Pegue o valor da coluna data_object_id, e troque abaixo.


                Ao inves do usual:

                select dbms_rowid.rowid_create(, , , ) from dual;

                use

                select dbms_rowid.rowid_create(, , , ) from dual;

                Irá gerar outro rowid. Caso seja o mesmo código, ignore hehe[/b]

                #101810
                davidfs
                Participante

                  Não vigou 🙁

                  O engraçado é que é por uma letra que não fecha o rowid:

                  É para ser assim: AAAFRjAAIAAAaZpAAA
                  Sempre vem assim: AAAFRjAAIAAAaZ6AAA

                  😡

                  #101831
                  vieri
                  Participante

                    se vc fazer um processo básico de DML irá funcionar.

                    se for dentro de tabela temporária, se for trigger ou outras operações, procedure que trabalha os dados.
                    o ROWID , pode sofrer alterações em tempo de execução.. então acaba não batendo mesmo.

                    não conheço outra solução para isso. e não sei se o Oracle tem.

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