Opción para borrar última operación insertada
Sí es cierto que tengo un problema sobre la pregunta que te planteé hace unos días acerca de cómo implementar una opción para borrar la última operación insertada.
Lo del simulador no me ha dado problemas, pero me he dado cuenta al ponerme con esto otro más detenidamente que no puedo hacer un rollback como me sugeriste porque yo siempre cierro la conexión. Mi forma de trabajar conn las conexiones a la base de datos es esta:
...
try {
conn = MySQLDAOFactory.getConnection();
conn.setAutoCommit(false);
// Componemos la sentencia SQL
String query = "UPDATE cartera SET entidad_gest = ? WHERE (id_usuario = ? AND id_cartera = ?)";
prepStat = conn.prepareStatement(query);
// Pasamos los parámetros a la sentencia
prepStat.setString(1, entGest);
prepStat.setString(2, idUsuar);
prepStat.setString(3, idCart);
// Ejecutamos la sentencia, actualizando la entidad gestora
prepStat.executeUpdate();
// Materializamos la sentencia en la base de datos
conn.commit();
} catch (Exception e) {
/* Fallo irrecuperable. Lanzo "RuntimeException"
Deshago cualquier cambio realizado en la base de datos */
try {
conn.rollback();
} catch (Exception e2) {
logg.warn("Excepción al ejecutar 'rollback'", e2);
}
throw new RuntimeException("Se ha producido un error en el acceso a la base de datos", e);
} finally {
MySQLDAOFactory.closeAll(conn, prepStat); // Cerramos conexión y sentencia
}
Como ves, abro y cierro la conexión porque creo que es más eficiente así, y el rollback sólo lo uso por si se producen excepciones. Con esta forma de trabajar con la base de datos no hay ninguna posibilidad de borrar la última operación insertada como me sugeriste. Lo único que se me ocurre es utilizar otra sentencia sql para borrar la tupla de la base de datos cuando el usuario lo solicite, pero no sé si esta es una forma habitual de hacer esto. Igual incluso debería limitar el borrado de este tipo a un par de operaciones solamente, para que no se pueda estar continuamente (si el usuario lo provoca) borrando tuplas ya insertadas. ¿Qué opinas?
Otra cosa más. No he hecho uso aún del "synchronized" en la
aplicación y creo que debería hacerlo, ¿no? ¿Dónde debo hacerlo y cómo?
Lo del simulador no me ha dado problemas, pero me he dado cuenta al ponerme con esto otro más detenidamente que no puedo hacer un rollback como me sugeriste porque yo siempre cierro la conexión. Mi forma de trabajar conn las conexiones a la base de datos es esta:
...
try {
conn = MySQLDAOFactory.getConnection();
conn.setAutoCommit(false);
// Componemos la sentencia SQL
String query = "UPDATE cartera SET entidad_gest = ? WHERE (id_usuario = ? AND id_cartera = ?)";
prepStat = conn.prepareStatement(query);
// Pasamos los parámetros a la sentencia
prepStat.setString(1, entGest);
prepStat.setString(2, idUsuar);
prepStat.setString(3, idCart);
// Ejecutamos la sentencia, actualizando la entidad gestora
prepStat.executeUpdate();
// Materializamos la sentencia en la base de datos
conn.commit();
} catch (Exception e) {
/* Fallo irrecuperable. Lanzo "RuntimeException"
Deshago cualquier cambio realizado en la base de datos */
try {
conn.rollback();
} catch (Exception e2) {
logg.warn("Excepción al ejecutar 'rollback'", e2);
}
throw new RuntimeException("Se ha producido un error en el acceso a la base de datos", e);
} finally {
MySQLDAOFactory.closeAll(conn, prepStat); // Cerramos conexión y sentencia
}
Como ves, abro y cierro la conexión porque creo que es más eficiente así, y el rollback sólo lo uso por si se producen excepciones. Con esta forma de trabajar con la base de datos no hay ninguna posibilidad de borrar la última operación insertada como me sugeriste. Lo único que se me ocurre es utilizar otra sentencia sql para borrar la tupla de la base de datos cuando el usuario lo solicite, pero no sé si esta es una forma habitual de hacer esto. Igual incluso debería limitar el borrado de este tipo a un par de operaciones solamente, para que no se pueda estar continuamente (si el usuario lo provoca) borrando tuplas ya insertadas. ¿Qué opinas?
Otra cosa más. No he hecho uso aún del "synchronized" en la
aplicación y creo que debería hacerlo, ¿no? ¿Dónde debo hacerlo y cómo?
1 Respuesta
Respuesta de jruben
1