Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvidas a respeito do connection.commit

Se eu consigo recuperar o ID do produto por meio do ResultSet com o código abaixo...

ResultSet rst = stm.getGeneratedKeys();
while (rst.next() {
Integer id = rst.getInt(1);
System.out.println ("O id criado foi: " + id);
}
rst.close();

... não significa que o produto foi inserido no banco de dados? Por que ainda é necessário fazer o connection.comit()?

Além disso, caso o produto não tenha sido efetivamente colocado no banco de dados, por que, no caso de exceção, eu preciso acionar o método connection.rollback? Porque se a exceção foi lançada, o commit nem foi acionado:

            try { PreparedStatement stm  = 
                    connection.prepareStatement ("INSERT INTO PRODUTO (nome, descricao) VALUES (?, ?)",
                    Statement.RETURN_GENERATED_KEYS);

        adicionarVariavel("SmartTV", "45 polegadas", stm);
        adicionarVariavel("Radio", "Radio de bateria", stm);
        connection.commit();
        stm.close();
        connection.close();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("ROLLBACK EXECUTADO");
            connection.rollback();
        }
1 resposta
solução!

Thiago, boa noite. De fato você consegue recuperar o ID, porém isso não significa que a transação foi efetivada. O que isso quer dizer, significa que se no segundo insert, houver um erro, a transação não será commitada e o ID gerado do primeiro insert não se manterá no banco. A gente faz o rollback, exatamente para garantir que com um erro, mesmo a transação não sendo commitada, será feito rollback do que já executou. Ficou mais claro? =)