package ar.com.javacuriosities.jdbc; import static ar.com.javacuriosities.jdbc.util.Constants.PASSWORD; import static ar.com.javacuriosities.jdbc.util.Constants.URL; import static ar.com.javacuriosities.jdbc.util.Constants.USER; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; /* * Una transacción es un conjunto de acciones que deben ser tratadas como una acción única o atomica. * Las bases de datos garantizan esto cumpliendo con ACID (Atomicity, Consistency, Isolation, Durability) * * Para el manejo de las transacciones tenemos tres métodos claves * * setAutoCommit: Nos permite indicar que vamos a comenzar una transacción, utilizando el auto commit en "false" * rollback: En caso de error podemos usar esto para dejar la base de datos en un estado consistente * commit: Nos permite confirmar el set de acciones que ejecutamos y que sean aplicados en la base * * Otra cosa a tener en cuenta con las transacciones es el "Isolation Level" * * Isolation Level | Transactions | Dirty Reads | Non-Repeatable Reads | Phantom Reads * TRANSACTION_NONE | Not supported | Not applicable| Not applicable | Not applicable * TRANSACTION_READ_COMMITTED | Supported | Prevented | Allowed | Allowed * TRANSACTION_READ_UNCOMMITTED | Supported | Allowed | Allowed | Allowed * TRANSACTION_REPEATABLE_READ | Supported | Prevented | Prevented | Allowed * TRANSACTION_SERIALIZABLE | Supported | Prevented | Prevented | Prevented * * Dirty read: Sucede cuando accedemos a un valor actualizado que aun no fue commiteado * Non-repeatable read: Sucede cuando una transacción A obtiene una fila y esta es actualizada por una transacción B, y en la misma transacción A se vuelve a recuperar la fila pero ahora contiene otro valor * Phantom read: Sucede cuando una transacción A obtiene un conjunto de filas que satisfacen una condición, y ahora una transacción B inserta o actualiza filas para que cumplan con la misma condición, si la transacción A vuelve a pedir los datos puede ver las nuevas filas que cumplen con esta condición * */ public class Lesson06Transactions { public static void main(String[] args) { try { Class.forName("com.mysql.jdbc.Driver"); try (Connection connection = DriverManager.getConnection(URL, USER, PASSWORD)) { connection.setAutoCommit(false); try (Statement statement = connection.createStatement()) { // Ejecutamos un query que falle con una SQLException statement.execute("DELETE FROM alumnos WHERE id_alumnos = 1"); connection.commit(); } catch (SQLException ex) { connection.rollback(); throw ex; } } } catch (Exception e) { // Log and Handle exception e.printStackTrace(); } } }