Crear varias tablas o ninguna usando commit
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?
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?
1 Respuesta
Respuesta
1