Boa dia a todos, estou querendo executar intruções DDL com o banco, e a minha intenção é que ao ocorrer um erro na execução todo o código seja “descartado”.
Andei pesquisando sobre o método rollback, e teoricamente ele se encarrega de fazer isso. Porém nos testes que faço eu forço um erro em uma String (base3) para forçar o rollback.
O que acontece, é que ao executar os dois primeiros Statements, eles estão sendo criados.
Segue abaixo o código:
public static void teste2() {
try {
String base = "novaBase";
Connection con = null;
Class.forName("com.mysql.jdbc.Driver");
String conexao = "jdbc:mysql://localhost/" + base + "?user=root&password=";
con = DriverManager.getConnection(conexao);
Savepoint antes = con.setSavepoint("boa");
con.setAutoCommit(false);
try {
String base1 = "CREATE TABLE `agendaoperacao` (`id` int(11) NOT NULL AUTO_INCREMENT) ENGINE=innodb DEFAULT CHARSET=utf8 ;";
String base2 = "CREATE TABLE `alarme` (`id` int(10) NOT NULL AUTO_INCREMENT, `data` datetime DEFAULT NULL) ENGINE=innodb DEFAULT CHARSET=utf8 ;";
String base3 = "CREATE ABLE `cancelamentohorarios` (`id` int(11) NOT NULL AUTO_INCREMENT, `motivo` varchar(60) NOT NULL DEFAULT '') ENGINE=innodb DEFAULT CHARSET=utf8 ;";
System.out.println(con.getAutoCommit());
Statement st = null;
st = con.createStatement();
st.execute(base1);
st.execute(base2);
st.execute(base3);
con.commit();
System.out.println("con commit...");
} catch (SQLException e) {
con.rollback(antes);
System.out.println("con rollback...");
con.close();
System.out.println("con fechada...");
}
} catch (Exception e) {
e.printStackTrace();
}
} //fim do teste2
Estou fazendo alguma confusão?
Comando DDL são commitados automaticamente? Devo usar outra classe?
Espero que possam me ajudar.