miércoles, 7 de mayo de 2008

Transacciones en jdbc

Bueno despues que uno aprende a trabajar con jdbc seria interesante aprender este concepto que es muy util , imaginate que estas haciendo un programa que tengas que asegurarte que en un proceso se guarden obligatoriamente tres insert,por ello JDBC permite agrupar instrucciones SQL en una sola transacción. Así, podemos asegurar las propiedades ACID (Atomicidad, Consistencia, Aislamiento, Durabilidad) usando las facilidades transaccionales del JDBC.
El control de la transacción es realizado por el objeto Connection. Cuando una conexión se crea, por defecto es en modo auto - commit. Esto significa que cada instrucción individual SQL se trata como una transacción en sí misma, y se comprometerá en cuanto la ejecución sea terminada.

Ejemplo : tenemos dos insert , para que se guarden se tienen que guardar los dos bien .osea si aceptamos el primero y el segundo nunca se guarda o da un error el primero no se guarda.



//////////////////////////////////////////////
// primer boton


try{

if (con.getAutoCommit() )
con.setAutoCommit( false );

stat = con.createStatement();
//vamos hacer le primer insert


String unsql = "insert into persona values ('"+jTextField1.getText()
+ "', '" + jTextField2.getText() + "', '"
+jTextField3.getText()+ "', '" +jTextField4.getText()
+ "' )";
stat.executeUpdate(unsql);

}
catch(Exception e){
System.out.println(" "+e);
}

///////////////////////////////////////////////////////////

// segundo boton

try{

String unsql = "insert into persona values ('"+jTextField5.getText() + "', '" + jTextField6.getText() + "', '" + jTextField7.getText() + "', '" +jTextField8.getText() + "' )";
stat.executeUpdate(unsql);

con.commit();

}
catch(Exception e){

deshacer( ); // este metodo es importante

System.out.println(" "+e);
}

////////////////////////////////////////////////////////////

void deshacer( ) {
try {
con.rollback();
}
catch (SQLException e) {
System.out.println("Error. No hemos podido deshacer." + e.getMessage() );
}
}

////////////////////////////////////////////////////////////


aunque esta un podo desordenado el codigo, espero que dando una vuelta lo entiendan, sobre la conexion

Connection con; // variables de instancia
Statement stat ;

/** Creates new form ventana */
public ventana() { // en el constructor
initComponents();

try{

Class.forName("org.postgresql.Driver"); // este busca el jar de postgres
con = DriverManager.getConnection("jdbc:postgresql://localhost/arq2 tier", "postgres", "1234");


}
catch(Exception e){
System.out.println(" "+e);
}
}

2 comentarios:

// [N][A][C][H] dijo...

te falta el stat.close();

aca hay un ejemplo mas claro que raramente lo saque de la pag de microsoft
public static void executeTransaction(Connection con) {
try {
//Switch to manual transaction mode by setting
//autocommit to false. Note that this starts the first
//manual transaction.
con.setAutoCommit(false);
Statement stmt = con.createStatement();
stmt.executeUpdate("INSERT INTO Production.ScrapReason(Name) VALUES('Wrong size')");
stmt.executeUpdate("INSERT INTO Production.ScrapReason(Name) VALUES('Wrong color')");
con.commit(); //This commits the transaction and starts a new one.
stmt.close(); //This turns off the transaction.
System.out.println("Transaction succeeded. Both records were written to the database.");
}
catch (SQLException ex) {
ex.printStackTrace();
try {
con.rollback();
System.out.println("Transaction failed. No records were written to the database.");
}
catch (SQLException se) {
se.printStackTrace();
}
}
}

fernando luz dijo...

Hola primero que nada muchas gracias por el aporte esta muy bueno paro quisiqera saber si este ejemplo funcionaria de la misma forma para la insercion en una tabla y modificacion en otra