Tengo un problemilla, he creado las funciones de insercion en la BBDD, cada vez que alguien inserta en la BBDD pasa por llama a esa clase. La clase inserta en la base de datos y retorna el último id sertado, como vereis tambies se inserta el ultimo id en un campo de la tabla... la herramienta de trabajo funciona asi...
Mi pregunta esta relacionada con post anterior ya que aqui realizo varios commit el el mimo try y un único rollback en el catch.
Es correcto el siguiente uso
Código PHP:
try{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, user, pass);
conn.setAutoCommit(false);
try{
//BLOQUEO DE TABLA PARA ESCRITURA
PreparedStatement pstm = conn.prepareStatement(Sentencia);
if (prepare!=null){
for(int pre=1;pre<prepare.length;pre++){
pstm.setString(pre, prepare[pre]);
}
}
pstm.execute();
conn.commit();
pstm.close();
// if(!incremento.equals("none")){
PreparedStatement SlastID = conn.prepareStatement("SELECT LAST_INSERT_ID() AS LASTID");
ResultSet lastID = SlastID.executeQuery();
conn.commit();
while (lastID.next()){
questionID = lastID.getLong("LASTID");
}
if(!incremento.equals("none")){
Updat="UPDATE "+tabla+" set "+incremento+" =_idregistro where _idregistro="+ questionID+" and "+incremento+" = 0";
PreparedStatement Upd = conn.prepareStatement(Updat);
resUpdate= Upd.executeUpdate();
conn.commit();
//SlastID.close();
//lastID.close();
Upd.close();
}
//pstm.close();
SlastID.close();
lastID.close();
conn.close();
}catch (SQLException ex) {
conn.rollback();
System.out.println("ERROR en consulta SQL.");
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}finally{
try{
conn.setAutoCommit(true);
//DESBLOQUEO DE TABLA
// conn.close();
} catch (SQLException y) { System.out.println("ERROR en consulta SQL.");
System.out.println("SQLException: " + y.getMessage());
System.out.println("SQLState: " + y.getSQLState());
System.out.println("VendorError: " + y.getErrorCode());
}
} //finally
} catch(SQLException u){
System.out.println("ERROR en consulta conexxion.");
System.out.println("SQLException: " + u.getMessage());
System.out.println("SQLState: " + u.getSQLState());
System.out.println("VendorError: " + u.getErrorCode());
}catch (ClassNotFoundException e){
//Mostra errors de creació del driver
System.out.println("No s'ha pogut conectar amb el servidor! :(");
}
return questionID;
Por cierto si yo bloqueo la tabla, ¿puedo realizar las 2 o 3 operaciones de forma atomica?
Es decir, que me haga el insert, me lea el ultimo id y en caso necesario me lo inserte en la tabla SIN que nadie pueda escribir o leer de la misma?
El bloqueo de escritura, ¿bloquea tambien la lectura o solo la escritura?... tendria que desempolvar mis apuntes de calse
Muchas gracias por todo.