3
respostas

Exemplo de Transação com solução incorreta

Bom Dia, talvez tenha encontrado um erro nesse codigo:

public void alterar(Integer numero, BigDecimal valor) {
        PreparedStatement ps;
        String sql = "UPDATE conta SET saldo = ? WHERE numero = ?";

        try {
            conn.setAutoCommit(false);

            ps = conn.prepareStatement(sql);

            ps.setBigDecimal(1, valor);
            ps.setInt(2, numero);

            ps.execute();
            conn.commit();
            ps.close();
            conn.close();
        } catch (SQLException e) {
            try {
                conn.rollback();
            } catch (SQLException ex) {
                throw new RuntimeException(ex);
            }
            throw new RuntimeException(e);
        }
    }

Ao utilizar a solução dada pelo curso, o erro continua a acontecer, pos a solução dada trata o possivel erro dentro do metodo que é chamdo duas vezes de forma separadas. Não sei se era apenas um exemplo, porem ele não é funcional "Até porque so realizamos uma operação neste codigo". Ainda não terminei de ver o curso, porem acredito que se propõem uma reformulação para esse problema, ele deveria ser inserido nesse ponto do curso

3 respostas

Oii, Newton! Tudo bem?

Obrigada pelo detalhe! Já repassamos a atividade para a nossa equipe e estamos analisando com cuidado o código.

Se outra sugestão surgir, fique à vontade para postar. O olhar crítico de vocês nos ajuda a melhorar o conteúdo entregue.

Abraços!

Olá Newton! Tudo certinho?

Pode me dar um exemplo de como o código não seria funcional nesse caso? Seria na parte dos try-catches?

Na outra parte do código, acredito que esteja funcionando normalmente: o método alterar é chamado mais de uma vez no programa. Mas toda vez que ele é chamado, tenta-se executar a operação e, caso ela não seja efetivada (como quando ocorre uma SQLException), volta-se ao estado anterior, utilizando o rollback. Já caso ela seja cumprida, é confirmada utilizando o commit.

Agradeço pela observação e fico no aguardo. Abraços!

Olá Iasmin! Tudo certo, e com você?

Bom, em etapas individuais esse código é funcional. Porem, a proposta seria para que ele desse um rollback quando ocorresse um erro na transferência. Ai que encontrei o problema, pos na estrutura proposta ele faz o commite de saque, porem se tiver um problema na conta a ser depositada, o erro acontece e o saque ja foi commitado. Esse trecho de código é disponibilizado na parte 4 aula 7, e ele entra como solução desse problema. Acredito que uma possível solução seria um metodo transfere com o tratamento dentro dele.

Nessa foto podemos observar o erro em questão