1
resposta

Utilidade do Rollback

Olá

Na segunda parte da aula, onde colocamos os blocos try, o código fica assim:

public class TestaInsercao4 {

    public static void main(String[] args) throws SQLException {

        try (Connection connection = Database.getConnection()){
            connection.setAutoCommit(false);
            String sql = "insert into produto (nome, descricao) values (?, ?)";

            try (PreparedStatement statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)){
                adiciona("TV LCD", "32 polegadas", statement);
                adiciona("Blueray", "Full HDMI", statement);
                connection.commit();
            } catch (Exception e) {
                e.printStackTrace();
                connection.rollback();
                System.out.println("Rollback Efetuado");
            }
        }
    }


    private static void adiciona(String nome, String descricao, PreparedStatement statement) throws SQLException {

        if(nome.equals("Blueray")) {
            throw new IllegalArgumentException("Problema Ocorrido");
        }

        statement.setString(1, nome);
        statement.setString(2, descricao);

        boolean resultado = statement.execute();
        try (ResultSet resultSet = statement.getGeneratedKeys()){
            while(resultSet.next()) {
                int id = resultSet.getInt("id");
                System.out.println("id adicionado: " + id);
            }
        }
    }
}

Porém, se eu remover a linha "connection.rollback()", o programa gera o mesmo resultado. O que é esperado, pois o "connection.commit()" no bloco try só está ocorrendo ao fim das transações, então caso haja uma exception, não haverá commit, com ou sem o rollback. Então pergunto, qual é a real utilidade de colocarmos "connection.rollback()" no programa?

1 resposta

O rollback precisa estar no código porque você não tem garantia que ambos os inserts vão funcionar corretamente, se um funcionar e o outro não você gera inconsistência no banco. Se tudo der certo, o commit é feito e se um deles não der certo é feito o rollback do que funcionou, se algum deles funcionou.

Abraço.