Pular para o conteúdo
  • Este tópico contém 2 respostas, 2 vozes e foi atualizado pela última vez 11 anos, 4 meses atrás por Avatar de Thiago LuizThiago Luiz.
Visualizando 3 posts - 1 até 3 (de 3 do total)
  • Autor
    Posts
  • #105612
    Avatar de Thiago LuizThiago Luiz
    Participante

      Prezados(a)Bom dia!

      Tenho O banco de dados oracle 11g, e apresenta constatemente a LINHA ALOCADA (FANPEDID), que é a tabela de pedidos. Então quando o Comercial, lança os pedidos, apresenta a linha alocada e executo o seguinte comando :
      SELECT ss.sid,ss.serial#, ss.username, ss.osuser, ao.owner || ‘.’ || ao.object_name AS OBJECT_NAME
      FROM v$session ss, v$lock lk, dba_objects ao
      WHERE lk.sid = ss.sid
      AND ss.username is not null
      AND ao.object_id(+) = lk.id1
      AND ao.object_name like ‘%FANPEDID%’;

      alter system kill session ‘50,32’ immediate

      Seguem algumas explicações.

      ? Linha alocada não ocorre em modo Pesquisa. Se ocorrer é inconformidade do sistema e nos contate imediatamente;
      ? Linha alocada é uma proteção do sistema para que dois usuários não MODIFIQUEM o mesmo Pedido, NF, cadastro, etc;
      ? Linha alocada não trava o sistema. Se ocorrer é inconformidade do sistema e nos contate imediatamente;
      ? Se um usuário acessar o Pedido, alterar o modo para MODIFICAR e utilizar a tecla Page Down, Page Up para navegar entre eles, eventualmente poderá acessar o Pedido que está sendo alterado por outro usuário. Neste caso ocorrerá corretamente a mensagem de linha alocada;

      So que nem o prestador de serviços dono do ERP, não conseguiu identificar o problema ?

      Então,quando executo esse comando, mata a sessão do usuário, caso o pedido seja novo.
      O que foi criado, não é excluido, somente o que será criado.

      Tem alguma forma no Banco de tirar essa linha alocada, ou miminizar o impacto disso.
      Pois, estamos sofrendo demais no ERP, em relação a esse rotina de inserçao de pedidos.

      Alguem poderia clarear a minha ideia para a soluçao ?

      #105622
      Avatar de lobomaudiegolobomaudiego
      Participante

        Thiago Bom dia!,

        Pelo que entendi fica-se locado a tabela de pedidos quando é feita a inserção:

        1 – Verifique se seu banco é Enterprise Edition;
        2 – Verifique se essa tabela possui index do tipo BITMAP, esse tipo de index causa lock em algumas ocasiões de inserção.
        3 – verifique a sessão que está travando as outras:

        Col sess format a20 heading "User"
        Col ib heading ""
        Col sid heading "Sid"
        col ki for a2 heading "ki"
        col serial for 999999 heading "Serial"

        select (select username from v$session where sid=a.sid) sess,
        '@k' as ki,
        a.sid,
        (select serial# from v$session where sid=a.sid) serial,
        ' is blocking ' ib,
        (select username from v$session where sid=b.sid) sess,
        '@k' as ki,
        b.sid,
        (select serial# from v$session where sid=b.sid) serial
        from v$lock a, v$lock b
        where a.block = 1
        and b.request > 0
        and a.id1 = b.id1
        and a.id2 = b.id2
        /

        4 – Verifique o que ela está fazendo:

        SET LINESIZE 300
        COLUMN spid FORMAT A10
        COLUMN username FORMAT A10
        COLUMN program FORMAT A20
        COLUMN kill_pid FORMAT A18
        COLUMN machine FORMAT A15
        COLUMN wait_class FORMAT A15
        COLUMN kill FORMAT A2
        COLUMN os_username FORMAT a18 HEADING 'O/S User'
        COLUMN sw for 99999S
        COLUMN kill_sess for a50
        COLUMN module for a35

        SELECT '@k' as kill,
        s.sid,
        s.serial#,
        p.spid,
        s.sql_id,
        s.module,
        s.logon_time,
        s.sql_exec_start,
        s.username,
        s.osuser as os_username,
        REPLACE(REPLACE(S.MACHINE, 'BR-LIHI', ''), 'BR-LIHI-', '') AS MACHINE,
        s.program,
        s.wait_class,
        s.wait_time,
        s.seconds_in_wait as sw,
        'kill -9 '|| spid as kill_pid,
        'alter system kill session '||chr(39)||s.sid||', '||s.serial#||chr(39)|| ' immediate;' as kill_sess
        FROM v$session s
        JOIN v$process p ON p.addr = s.paddr
        WHERE s.sid = '&id'
        OR UPPER(s.username) = upper('&us')
        OR upper(s.osuser) = upper('&os')
        ORDER BY s.SECONDS_IN_WAIT DESC
        /

        5 -Pegue o SQL_ID e verifique o comando executado:


        set linesize 300
        col sql_fulltext for a100 wor

        SELECT SQL_ID,
        EXECUTIONS,
        sql_fulltext
        from v$sql
        where sql_id = '&sqlid'
        /

        Se for lock devido a algum DELETE, UPDATE é erro de aplicação, sendo assim os desenvolvedores tem que corrigir.

        Att,

        Diego Monterio

        #105629
        Avatar de Thiago LuizThiago Luiz
        Participante

          Ola Diego Boa tarde!

          Obrigado pela resposta!

          Eu nao tenho um conhecimento avançado em BD 11G. A situaçao do LOCK ocorre quando vai modificar um pedido entende e fazer a inserção. O ERP é um MRP entende, entao sao varias formas de fazer a inserção do pedido.Fluxo do Pedido,Telemarketing CRM, pedido. Na maioria das vezes ocorre na rotina de telemarketing CRM.

          O Banco que nós temos é Oracle 11G.

          Qual a finalidade dessa Query?
          Ela manda alterar os Variáveis de Substituição (ID), US, OS. O que seria esses 3 parametros quando sao solicitados para digitar?

          SELECT ‘@k’ as kill,
          s.sid,
          s.serial#,
          p.spid,
          s.sql_id,
          s.module,
          s.logon_time,
          s.sql_exec_start,
          s.username,
          s.osuser as os_username,
          REPLACE(REPLACE(S.MACHINE, ‘BR-LIHI’, ”), ‘BR-LIHI-‘, ”) AS MACHINE,
          s.program,
          s.wait_class,
          s.wait_time,
          s.seconds_in_wait as sw,
          ‘kill -9 ‘|| spid as kill_pid,
          ‘alter system kill session ‘||chr(39)||s.sid||’, ‘||s.serial#||chr(39)|| ‘ immediate;’ as kill_sess
          FROM v$session s
          JOIN v$process p ON p.addr = s.paddr
          WHERE s.sid = ‘&id’
          OR UPPER(s.username) = upper(‘&us’)
          OR upper(s.osuser) = upper(‘&os’)
          ORDER BY s.SECONDS_IN_WAIT DESC
          /

          A outra query

          SELECT SQL_ID,
          EXECUTIONS,
          sql_fulltext
          from v$sql
          where sql_id = ‘&sqlid’
          /

          Como vou executar isso,em que ocasião ?

          Tem alguma coisa, que eu possa fazer para minimizar, essa questão?

          Obrigado!

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