Foros del Web » Programación para mayores de 30 ;) » Java »

Transacciones y commit

Estas en el tema de Transacciones y commit en el foro de Java en Foros del Web. Hola a todos y Feliz Año Nuevo Necesito realizar un conjunto de operaciones sobre una BBDD que se comporten como una transaccion, como una única ...
  #1 (permalink)  
Antiguo 02/01/2006, 04:06
 
Fecha de Ingreso: agosto-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 0
Transacciones y commit

Hola a todos y Feliz Año Nuevo

Necesito realizar un conjunto de operaciones sobre una BBDD que se comporten como una transaccion, como una única operación (atomicas), es decir que si todo va bien se realicen todas o que si algo falla no se realice niguna (una especie de rollback).

El problema es que en cada iteración he de hacer diversas inserciones y actualizaciones en la BBDD, pero se puede producir un error (es largo de explicar), por ello me interesa que todas esatas operaciones sobre la BBDD, se realicen todas o ninguna en cada iteración para no poner en peligro la integridad de la misma.

Muchas gracias por todo y prospero Año nuevo (que sea mejor que el anterior y nos regalen targetas graficas en el curro o similares , a falta de algo mejor... los del gremio ya me entendeis).

FelizAño NUevo.
  #2 (permalink)  
Antiguo 02/01/2006, 04:25
 
Fecha de Ingreso: diciembre-2005
Ubicación: Madrid, España
Mensajes: 154
Antigüedad: 18 años, 4 meses
Puntos: 2
Para eso tienes el commit:

Código:
// Antes de comenzar la transacción:
Connection conn = función_para_buscar_conexión_del_pool();
conn.setAutoCommit(false);

try 
{
  .... (todas las sentencias SQL aquí)
  conn.commit();
}
catch (SQLException e)
{
  conn.rollback();
}
finally
{
  try
  {
     conn.setAutoCommit(true);
     conn.close();
  }
   catch (SQLException e) { ... }
}
  #3 (permalink)  
Antiguo 02/01/2006, 05:47
 
Fecha de Ingreso: agosto-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 0
Muchas gracias . Una questión, las diferentes tareas a realizar y comprobar las tengo en diferentes metodos y las inserciones y modificacdiones en diferentes clases. Esto supongo que es problema ya que todas las operaciones se han de realizar en un try. ¿Es posible que se no hacer el commit hasta que yo se lo diga?, aunque las consultas esten en metodos diferentes.

Gracias
  #4 (permalink)  
Antiguo 04/04/2006, 06:40
 
Fecha de Ingreso: agosto-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 0
HOla a todos, en el script escrito por radian cuando intento incorporarlo a mi codigo me da error, ya que tengo la conexion creada dentro del try y cuando introduzco el rollback en el catch me dice que puede que no haya sido declarada.

Si alguin tiene una estructura de como montar las transacciones me haria un gran favor.


Muchas gracias por todo, como siempre , y hasta pronto
  #5 (permalink)  
Antiguo 04/04/2006, 08:02
 
Fecha de Ingreso: diciembre-2005
Ubicación: Madrid, España
Mensajes: 154
Antigüedad: 18 años, 4 meses
Puntos: 2
Cita:
HOla a todos, en el script escrito por radian cuando intento incorporarlo a mi codigo me da error, ya que tengo la conexion creada dentro del try y cuando introduzco el rollback en el catch me dice que puede que no haya sido declarada.
Código:
Connection conn = función_para_buscar_conexión_del_pool();
conn.setAutoCommit(false);
try 
{
  ...
La declaración se hace fuera del try-catch.

Saludos
  #6 (permalink)  
Antiguo 04/04/2006, 11:04
 
Fecha de Ingreso: agosto-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 0
YA lo he intentado pero si lo declaro fuera del try el netbeans me da error, en el class.forname y la conn. En cambio si lo meto dentro del try si que funciona.
"must to be caught or declared to be trhown" tengo declarada la conn el el constructor de la clase

String user = "login";
String pass = "";
String url = "jdbc:mysql://ip:puerto/bd_data";
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection (url, user, pass);

try{

PreparedStatement pstm = conn.prepareStatement(Sentencia);
if(prepare!=null ){
for(int pre=1;pre<prepare.length;pre++){
pstm.setString(pre, prepare[pre]);
}
}
pstm.execute();
pstm.close();


Nu se pq puede ser.
  #7 (permalink)  
Antiguo 04/04/2006, 11:43
 
Fecha de Ingreso: agosto-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 0
Me parece que ya va bien

String user = "login";
String pass = "";
String url = "jdbc:mysql://ip:port/Bd_data";

try{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, user, pass);
conn.setAutoCommit(false);

try{

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();

}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);
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 esta la clase :(");
}


Me parece que así funciona He multianidado los try


Muchas gracias!!!
  #8 (permalink)  
Antiguo 05/04/2006, 04:26
 
Fecha de Ingreso: agosto-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 0
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(urluserpass);
            
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(preprepare[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);
                    
resUpdateUpd.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.

Última edición por OrionKing; 05/04/2006 a las 04:48
  #9 (permalink)  
Antiguo 05/04/2006, 06:43
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
El bloqueo de tablas es una cuestion de la base de datos, más que de JDBC, asi que tendrías que mirar que SQL necesitarías para poder hacerlo dependiendo de la BDD utilizada.
JDBC te permite controlar las transacciones pero no el bloqueo de tablas.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:46.