Duvida Roolback

Discussão em 'Progress 4GL' iniciado por julianfiglioli, Setembro 28, 2015.

  1. julianfiglioli

    julianfiglioli Membro Participativo

    @rafael.andrade

    Efetuei o procedimento para teste.

    Primeiro executei o código, e preencheu a tabela com sucesso.
    Depois executei novamente e quando apareceu a mensagem, eu matei o usuário.

    Ao consultar a tabela, ela estava vazia.

    O DELETE TabelaTeste executou. A inserção do dado no campo não foi! =/
  2. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    é que o delete estava fora da transação, tá certo.

    Faz assim

    Com a tabela limpa, executa o código e quando aparecer a mensagem já mata o usuário, quando você abrir novamente e fizer um FOR EACH nessa tabela ela tem que estar vazia, isso indica que a transação funcionou perfeitamente

    Agora faz um outro teste com o DO TRANS puro, tipo:

    Código:
    FOR EACH TabelaTeste EXCLUSIVE-LOCK.
       DELETE TabelaTeste.
    END.
    
    TMaior:
    DO TRANS:
       CREATE TabelaTeste.
       ASSIGN TabelaTeste.Campo = "ABCDE".
       MESSAGE "Hora de matar este usuário" VIEW-AS ALERT-BOX INFO BUTTONS OK.
    END.
    
    Com o DO TRANS puro, o registro será criado mesmo matando o usuário (pelo menos foi o que conclui nos testes no 10.1C)
  3. Eilleen

    Eilleen Membro Ativo

    O Progress faz rollback sim, mas apenas da transação que está em execução no momento que a conexão "cai".
    No caso do exemplo do Rafael é pq o DELETE está em uma transação, e o CREATE está em outra.
  4. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Isso porque com a mensagem a transação fica aberta, não sei se ficou o claro pra vc a transação.
  5. julianfiglioli

    julianfiglioli Membro Participativo

    @rafael.andrade
    Realmente a tabela esta fazia. Isso significa que se fosse uma operação onde o bloco da inserção de dados fosse algo gigantesco, e o processo do cliente caísse, todas aquelas tarefas não seriam concluídas, correto? Porém, o que esta fora do bloco que você passou como exemplo, é executado. No caso do DELETE table.

    Se é isso mesmo, um problema bem complicado neh.

    @Eilleen
    A questão rollback é justamente essa. Dependendo de como a aplicação foi escrita, e a instrução ficar inserindo dados na tabela, acontecendo o commit, se o usuário cair, o processo ficará pela metade.
  6. Eilleen

    Eilleen Membro Ativo

    O processo só vai ficar pela metade se ele estiver dividido em mais de uma transação, como é o caso do exemplo que o Rafael passou.
    Se estivesse tudo dentro de uma única transação, o Progress ia desfazer tudo dentro da transação. Então a solução seria incluir tudo em uma só transação? Bem, isso é uma "faca de dois gumes"... se por um lado isso soluciona a questão do rollback, implica em transações maiores e muitas vezes em estouro de lock (parâmetro -l).
    O ideal para grandes processos, seria tratar regras de negócio numa camada, por exemplo registrar tudo em temp-tables, e usar transação única apenas na hora de jogar pro banco.
    julianfiglioli curtiu isso.

Compartilhe esta Página