Crear varias tablas o ninguna usando commit

Hola!
Quiero crear una serie de tablas en una base de datos de forma que, si se produce alguna excepción en el código de alguna, no se cree ninguna. Estoy haciendo lo siguiente, pero no funciona
Todo dentro de la misma clase, en una función tengo
...
try {
conn.setAutoCommit(false);
crearTablas(conn);
conn.commit();
} catch (SQLException e) {
conn.rollback();
}
...............
La función crearTablas(Connection conn) es así
// Crea las tablas de la base de datos
private void crearTablas(Connection conn) throws SQLException {
crearTablaPregSecretas(conn);
crearTablaEmprBolsa(conn);
crearTablaUsuario(conn);
crearTablaCartera(conn);
crearTablaEmpresa(conn);
crearTablaOperacion(conn);
}
y cada una de esas funciones es así
private void crearTablaPregSecretas(Connection conn) throws SQLException {
PreparedStatement prepStat = null;
try {
// Componemos la sentencia SQL
String query = "CREATE TABLE preg_secretas (" +
"preg_secreta VARCHAR(50) NOT NULL, " +
"CONSTRAINT preg_secretas_pk PRIMARY KEY (preg_secreta)) " +
"ENGINE = INNODB;";
prepStat = conn.prepareStatement(query);
// Ejecutamos la sentencia y obtenemos el resultado
prepStat.executeUpdate();
...
¿Captas la idea? Pretendo anular el commit, crear todas las tablas, y después activar el commit, de forma que si se produce una excepción en alguna tabla, no se activa el commit y se hace un rollback. El problema es que si se produce una excepción, por ejemplo, en el método de la tercera tabla, a pesar de lanzarse la excepción y no ejecutarse la activación del commit e ir al rollback, las dos anteriores se crean. ¿Cómo lo soluciono?
Gracias

1 respuesta

1
Respuesta de Anónimo
Hola.
Puedes intentar crear todas las tablas en el mismo bloque try y hacer el commit() al final, poniendo el rollback en el bloque catch(). Es decir:
try {
    crearTabla1();
    crearTabla2();
    ...
    crearTablaN();
    commit();
}
catch (...) {
    rollback();
}
Espero que mi respuesta te sirva de algo.
Añade un comentario a esta respuesta
Añade tu respuesta
Haz clic para o
Escribe tu mensaje