Se define como Transacción en base de datos a una «unidad lógica de trabajo» compuesta por un conjunto de operaciones que se aplicaran una después de otra, es decir, es una forma de agrupar un conjunto acciones en una única acción el cual se ejecuta de la forma «todo o nada».
Una transacción cuenta con 4 características conocidas como ACID:
La responsabilidad de asegurar el cumplimiento de ACID, es compartida tanto por el desarrollador como por el servido SQL.
Ejemplo transacción en Java
Primero creamos un par de tablas en nuestra base de datos «TutorialJava» como se ve en la siguiente imagen:
Implementamos en java un código para ejecutar 2 instrucciones SQL para insertar un registro en cada tabla. Pero no usaremos transacciones.
1 import java.sql.Connection; 2 import java.sql.DriverManager; 3 import java.sql.PreparedStatement; 4 import java.sql.SQLException; 5 /** 6 * @see https://www.jc-mouse.net/ 7 * @author mouse 8 */ 9 public class Main { 10 11 public static void main(String[] args) throws SQLException { 12 Connection connection = null; 13 PreparedStatement cantidadStatement = null; 14 PreparedStatement nombreStatement = null; 15 try { 16 connection = DriverManager.getConnection("jdbc:mariadb://localhost:3306/TutorialJava", "root", ""); 17 System.out.println("> Conectado a la base de datos"); 18 19 //Instrucciones SQL para tabla1 y tabla2 20 String insertCantidad = "INSERT INTO tabla1(cantidad) VALUES(?)"; 21 String insertNombre = "INSERT INTO tabla2(nombre) VALUES(?)"; 22 23 cantidadStatement = connection.prepareStatement(insertCantidad); 24 nombreStatement = connection.prepareStatement(insertNombre); 25 26 //Datos para tabla1 y tabla2 27 cantidadStatement.setInt(1, 69); 28 nombreStatement.setString(1, "Mouse"); 29 30 //Ejecuta instrucciones SQL 31 System.out.println("> Ejecuta instrucciones SQL"); 32 cantidadStatement.execute(); 33 nombreStatement.execute(); 34 35 System.out.println("> Programa concluido con exito"); 36 37 } catch (SQLException ex) { 38 System.err.println(ex.getMessage()); 39 } finally { 40 if (cantidadStatement != null) { 41 cantidadStatement.close(); 42 } 43 if (nombreStatement != null) { 44 nombreStatement.close(); 45 } 46 } 47 } 48 49 }
Si se ejecuta este código obtendremos en pantalla lo siguiente:
Ahora modificaremos las lineas 27 y 28 con los datos «28» y «Rosa Melcacho«, este ultimo dato no cumple con la restricción de longitud de la tabla2 que es nombre: varchar(8). Ejecutemos para ver lo que pasa:
Como era de esperarse, obtenemos una excepción «Data too long for column ‘nombre’…», esto quiere decir que la instrucción SQL para la tabla2 se interrumpió, sin embargo la instrucción SQL para la tabla1 si finalizo correctamente, esto podemos apreciarlo si inspeccionamos las tablas donde vemos un nuevo registro para la tabla1 pero no para la tabla2.
Este tipo de errores elevados al rango de operaciones bancarias por ejemplo puede llegar a tener un gran impacto en la entidad financiera, para evitar estos contratiempos se debe utilizar transacciones.
Vamos a modificar un poco nuestro código:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; /** * @see https://www.jc-mouse.net/ * @author mouse */ public class Main { public static void main(String[] args) throws SQLException { Connection connection = null; PreparedStatement cantidadStatement = null; PreparedStatement nombreStatement = null; try { connection = DriverManager.getConnection("jdbc:mariadb://localhost:3306/TutorialJava", "root", ""); System.out.println("> Conectado a la base de datos"); //Desactiva confirmación automática connection.setAutoCommit(false); String insertCantidad = "INSERT INTO tabla1(cantidad) VALUES(?)"; String insertNombre = "INSERT INTO tabla2(nombre) VALUES(?)"; cantidadStatement = connection.prepareStatement(insertCantidad); nombreStatement = connection.prepareStatement(insertNombre); //Datos para tabla1 y tabla2 cantidadStatement.setInt(1, 28); nombreStatement.setString(1, "Rosa Melcacho"); //Ejecuta instrucciones SQL System.out.println("> Ejecuta instrucciones SQL"); cantidadStatement.execute(); nombreStatement.execute(); connection.commit(); System.out.println("> Programa concluido con exito"); } catch (SQLException ex) { System.err.println(ex.getMessage()); if (connection != null) { try { System.err.println("> Transacción abortada"); System.err.println("> Valores restaurados"); System.out.println("> Programa concluido"); connection.rollback(); } catch (SQLException ex1) { System.err.println(ex1.getMessage()); } } } finally { if (cantidadStatement != null) { cantidadStatement.close(); } if (nombreStatement != null) { nombreStatement.close(); } connection.setAutoCommit(true); } } }
En rojo las modificaciones más importantes, a saber:
es decir:
Volvemos a ejecutar nuestro programa y nuevamente vuelve a retornar la excepción, sin embargo en esta oportunidad al tener agrupado nuestras instrucciones SQL en una transacción, al producirse la excepción la operación es abortada y los cambios realizados en la base de datos son deshechos. Podemos verificar este hecho inspeccionando nuestra base de datos.
enjoy!
Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.
Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye
Enjoy! :)
Aplicación en Java realida con el IDE de Netbeans 6.9 para trabajar con images en Base de Datos en Access 2003, el progr...
JTree cuenta con métodos que nos permiten cambiar los iconos de cada nodo según su estado, sin embargo a veces esto no e...
BorderPane es un layout que distribuye los nodos hijos en 5 posiciones TOP, LEFT, BOTTOM, RIGHT y CENTER Los nodos hijos...
El CRC o Verificación de Redundancia Cíclica o Comprobación de redundancia cíclica es una técnica utilizada para detect...
La clase hashMap es muy util para almacenar objetos de la forma ( Clave, Objeto ), donde Clave es un identificador único...
Crear una librería swing para java utilizando Netbeans no es nada del otro mundo y la cantidad de código que vayamos a e...
El gigante tecnologico Google a puesto un bonito Doodle en su buscador que esta fascinando a sus millones de usuarios qu...
WhatsApp anuncio a través de su blog que ya se encuentra disponible la función de envío de fotos y videos TEMPORALES, es...
Muchas de las innovaciones computacionales de la NASA se desarrollaron para ayudar a explorar el espacio, pero ahora la...
TikTok es una plataforma de microvideos muy popular entre los jóvenes el cual cuenta ya con millones de videos cortps de...