Duvida sobre for each ou find first prendendo tabela

Discussão em 'Progress 4GL' iniciado por sidival, Dezembro 8, 2016.

  1. sidival

    sidival Membro Participativo

    É possivel um for each ou um find first travar uma tabela toda ?

    Examplo:

    Seção 1: For each tt-test where Id_test = 1
    Seção 2: For each tt-test where id_test = 2

    Alguem saberia dizer em que situação ou razão um dos programas mostrar a mensagem " Tabela em uso pelo usuario SIN-41" ?

    Att,
    Sidival
  2. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Há várias situações que causam essa mensagem, geralmente por errar na programação.

    De modo geral, para evitar esse tipo de mensagem deve-se colocar todos os registros como NO-LOCK e só fazer EXCLUSIVE-LOCK enquanto estiver alterando e depois
    volta para NO-LOCK novamente, tudo dentro de uma transação explícita (DO TRANS).

    E você também adiciona o NO-WAIT, tipo:
    FIND FIRST tabela WHERE tabela.id = 1 EXCLUSIVE-LOCK NO-ERROR NO-WAIT.

    Esse NO-WAIT não deixa aquela mensagem aparecer e retorna como NOT AVAIL, dando assim pra tratar essa mensagem.

    Abraço

    Rafael
  3. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Ah, e deve-se evitar a qualquer custo exibir mensagens durante a transação, use uma tabela temporária NO-UNDO e exibir as mensagens depois da transação.
  4. sidival

    sidival Membro Participativo

    Boa Tarde Rafael,
  5. sidival

    sidival Membro Participativo

    Boa Tarde Rafael,

    A duvida maior é que são registros diferentes, se eu estou especificando qual registro eu desejo o ponteiro do registro não deveria estar somente em um registro ? Como o segundo for each bloqueia o primeiro se são registros diferentes ?

    Att,
    Sidival
  6. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Bom, o progress tem um recurso que a meu ver é um lixo que é o seguinte:

    Se você faz um EXCLUSIVE-LOCK num bloco (seja procedure, trigger de botão/campo, function, ou qualquer outro bloco) ou SHARED-LOCK e houver alteração, o bloco inteiro se torna uma transação, exemplo:

    Código:
    PROCEDURE Exemplo1.
    
        MESSAGE "1. Antes tem transação?" SKIP "R.: " TRANS
            VIEW-AS ALERT-BOX INFO BUTTONS OK.
    
        FIND FIRST xip EXCLUSIVE-LOCK NO-ERROR.
    
        MESSAGE "1. Depois tem transação?" SKIP "R.: " TRANS
            VIEW-AS ALERT-BOX INFO BUTTONS OK.
    
    END PROCEDURE.
    
    PROCEDURE Exemplo2.
    
        MESSAGE "2. Antes tem transação?" SKIP "R.: " TRANS
            VIEW-AS ALERT-BOX INFO BUTTONS OK.
    
        FIND FIRST xip NO-ERROR.
    
        MESSAGE "2. Depois tem transação?" SKIP "R.: " TRANS
            VIEW-AS ALERT-BOX INFO BUTTONS OK.
    
    END PROCEDURE.
    
    PROCEDURE Exemplo3.
    
        MESSAGE "3. Antes tem transação?" SKIP "R.: " TRANS
            VIEW-AS ALERT-BOX INFO BUTTONS OK.
    
        FIND FIRST xip NO-ERROR.
        ASSIGN xip.ip = xip.ip.
        FIND CURRENT xip NO-LOCK NO-ERROR.
    
        MESSAGE "3. Depois tem transação?" SKIP "R.: " TRANS
            VIEW-AS ALERT-BOX INFO BUTTONS OK.
    
    END PROCEDURE.
    
    PROCEDURE Exemplo4.
    
        MESSAGE "4. Antes tem transação?" SKIP "R.: " TRANS
            VIEW-AS ALERT-BOX INFO BUTTONS OK.
    
        DO TRANS:
           FIND FIRST xip EXCLUSIVE-LOCK NO-ERROR.
           ASSIGN xip.ip = xip.ip.
           FIND CURRENT xip NO-LOCK NO-ERROR.
        END.
    
        MESSAGE "4. Depois tem transação?" SKIP "R.: " TRANS
            VIEW-AS ALERT-BOX INFO BUTTONS OK.
    
    END PROCEDURE.
    
    RUN Exemplo1.
    RUN Exemplo2.
    RUN Exemplo3.
    RUN Exemplo4.
    
    No Exemplo1 vai dar transação antes e depois.
    No Exemplo2 não vai dar transação porque só foi feito SHARED-LOCK mas não houve alteração.
    No Exemplo3 vai dar transação antes e depois, porque foi feito SHARED-LOCK e houve alteração do registro.
    No Exemplo4 não vai dar transação porque a alteração foi feito dentro de um bloco transacional, tanto faz usando EXCLUSIVE-LOCK como também SHARED-LOCK.

    Todos registros que estiverem dentro de um bloco transacional ficam indisponíveis.
    lucasiam curtiu isso.

Compartilhe esta Página