Hola y bienvenidos a esta elección.
A continuación vamos a revisar el tema de manejo de transacciones en JDBC.
Están listos.
Vamos bien vamos a partir de nuestro proyecto Manejo JDBC el cual se encuentra en la elección 3 vamos
a copiar este proyecto.
Damos clic derecho copy y ahora lo vamos a depositar en la Lección 4
dejamos el mismo nombre del proyecto Manejo jdbc
y damos clic en copy
cerramos el proyecto de la Lección 3 para saber en qué elección estamos simplemente nos posicionamos
sobre el proyecto y nos muestra la ruta completa.
Así que en este caso podemos observar que este proyecto está en la elección.
3 Y si nos posicionamos sobre este proyecto
observamos que está en la elección 4 así que vamos a cerrar el proyecto de la Lección 3 damos clic derecho
y damos siguen Clowes así que con esto ya tenemos nuestro nuevo proyecto para empezar a trabajar bien
lo que vamos a hacer para trabajar el concepto de transacciones es que vamos a modificar nuestra clase
personas JDBC
ya que es la que se encarga
de abrir la conexión a la base de datos.
Observamos esta línea donde obtenemos la conexión.
Sin embargo podemos observar que en cada método se está abriendo una conexión y se está cerrando al
finalizar este método.
En esta línea y así por cada método si realizamos una inserción se obtiene una conexión y posteriormente
se cierra.
Al finalizar este método sin embargo el manejo de transacciones no funciona así cuando manejamos una
transacción podemos ejecutar diferentes sentencias como pueden ser INSERT UPDATE o Lilit sobre una base
de datos no necesariamente sobre una tabla en particular sino que puede ser sobre cualquier tabla de
la base de datos y una transacción puede hacer el back de todas esas sentencias de una sola vez.
Sin embargo para que la transacción pueda manejar este rol back o el Comité de todas estas sentencias
SQL entonces se necesita que sea la misma conexión de base de datos.
De lo contrario si en cada método estamos cerrando la conexión y abriendo una nueva conexión ya no es
posible hacer de toda la transacción y tampoco roll back.
Así que para ello necesitamos extraer de esta clase el manejo de la conexión así que vamos a agregar
un atributo más el atributo se llama Conexión transaccional y esta variable va a ser de tipo conexión
así que vamos a modificar esta clase de personas JDBC para que en caso opcional pueda recibir un objeto
conexión desde afuera de esta clase y por ello es que esta variable de tipo conexión si es que recibimos
desde afuera de esta clase le vamos a llamar conexión transaccional posteriormente definimos un constructor
en esta clase para que podamos recibir esta conexión.
Agregamos un constructor vació
en este caso personas JDBC únicamente de nuestro constructor ovación pero también vamos a agregar un
constructor que pueda recibir el objeto de tipo conexión externo a esta clase.
Por lo tanto definimos el constructor persona JDBC y recibe un objeto de tipo conexión
y éste va a ser nuestra conexión transaccional y lo asignamos al atributo de nuestra clase la variable
que estamos recibiendo la conexión externa a esta clase para poder manejar la conexión transaccional
es el mismo tipo de conexión hacia la base de datos.
La única diferencia es que esta conexión no se va a cerrar al ejecutar uno de estos métodos sino que
se va a mantener abierta la transacción se va a manejar fuera de esta clase y la clase externa es la
que va a decidir cuándo se va a hacer commit o rol back de toda la transacción y lo que vamos a hacer
es modificar cada uno de los métodos para que en dado caso de que ya tengamos la conexión transaccional
entonces ya no creamos una nueva.
Así que agregamos el siguiente código si el objeto de conexión transaccional es diferente de nulo
entonces lo que vamos a hacer es utilizar el objeto de conexión transaccional.
De lo contrario obtenemos una nueva conexión en cuyo caso esa conexión se debe de cerrar.
Dentro de este método pero si la conexión se obtuvo a través del objeto conexión transaccional entonces
este método no debe de cerrar este objeto ya que de lo contrario estaría cerrando toda la transacción
y en el método Hoffa Inali vamos a hacer lo siguiente Vamos a preguntar de dónde obtuvimos la conexión
si el objeto conexión transaccional es igual a nulo entonces quiere decir que se creó una nueva transacción
dentro de este método.
Por lo tanto se debe de cerrar esta línea de código debe ir dentro de este IFF para que podamos cerrar
el objeto conexión debido a que la conexión transaccional fue igual a Nul.
Por lo tanto entonces quiere decir que se creó dentro de este método una nueva conexión y por lo tanto
la cerramos pero si este objeto de conexión es diferente de nulo entonces quiere decir que no se debe
de cerrar bien así que esos son los cambios que vamos a realizar en cada uno de nuestros métodos podemos
copiar esta misma línea
y donde obtenemos la conexión vamos a modificar cada una de las líneas en cada uno de nuestros métodos
para que obtenga la conexión si es que no la estamos recibiendo nuestro constructor también modificamos
el método update y modificamos el método Lilit
y también copiamos el código de nuestro método Select el que ya hemos modificado del bloque finales
donde revisamos si el objeto de conexión transaccional es igual a nulo entonces se cierra la conexión
que se abrió dentro de este método y lo modificamos en cada método en el método de insert modificamos
esta línea
posteriormente en el método obtained modificamos esta línea y en el método Dili también modificamos
esta línea
y damos formato a nuestra clase.
Ahora vamos hacia nuestra prueba abrimos la clase manejo personas
vamos a quitar todo este código para que no haya confusión vamos a hacerlo desde cero y escribimos lo
siguiente creamos un objeto de tipo personal JDBC
llamado personae JDBC
y posteriormente lo que vamos a hacer es crear un objeto de tipo conexión ya que recordemos que la conexión
ahora la vamos a manejar desde fuera de la clase persona JDBC así que creamos un objeto
llamado Conexión y lo que vamos a hacer es con ayuda de la clase conexión mandar a llamar el método
de conexión para que nos regrese una conexión
esto puede arrojar una excepción por lo tanto lo envolvemos en un bloque y calle
y también importamos la clase a punto SQL conexión y debido a que vamos a utilizar varias clases de
este paquete ponemos ya punto SQL punto asterisco y quitamos las demás clases que están importadas
y en el bloque catch mandamos a imprimir la acepción en dado caso de que ocurra
así que con esto ya tenemos nuestra conexión pero fuera de la clase persona JDBC ahora revisamos si
la conexión está en modo autocompletar ya que el manejo de autonomía por default es igual a.
Pero vamos a revisarlo.
Entonces preguntamos si la conexión
Autonomy es verdadero
entonces vamos a invertirlo mandamos a llamar el método set Atomic y lo ponemos en modo fouls esto debido
a que necesitamos que la conexión no haga AutoCAD MIT que no se haga de manera automática debido a que
nosotros vamos a hacerlo manualmente pero normalmente eso está configurado para que se maneje por default
igual.
Esto quiere decir que al terminar de ejecutarse una sentencia en automático se guardan los cambios pero
eso en este caso no lo queremos.
Queremos la característica de que cuando se ejecuten las sentencias no se guarden los cambios de manera
inmediata sino hasta que hagamos toda la transacción bien ahora en esta variable que declaramos vamos
a pasarla después de que hemos creado nuestra variable de conexión y vamos a utilizar el constructor
que recibe nuestro objeto conexión para proporcionar esta conexión que estamos creando de manera externa
a esta clase y así poder manejar el concepto transaccional.
Si utilizamos esta clase sin proporcionarle el objeto conexión entonces cada que ejecutemos el método
Select insert etc se van a guardar los cambios sin oportunidad de hacer commit o roll back de toda la
transacción.
Lo cual tampoco es que esté mal.
Sin embargo no aplicaría simplemente el concepto transaccional bien ahora lo que vamos a hacer es ejecutar
varias sentencias dentro de la transacción.
Por ejemplo
persona JDBC vamos a hacer unos datos y vamos a revisar los datos que tenemos en la base de datos vamos
a la tabla de persona damos un derecho obvio data y podemos ver que tenemos los registros de Juan Pérez
y Karla Gómez vamos a hacer alguna modificación por ejemplo en el nombre de Carla se va a llamar en
lugar de Carla simplemente va a ser Carla Ivonne
para ello vamos a crear un nuevo objeto de tipo Persona
que se va a llamar cambio persona
y escribimos en nuestra variable de persona cambio persona cómo va a ser una modificación.
Debemos establecer cuál es el Heydi en este caso es el registro dos
el nombre lo vamos a cambiar.
En lugar de que únicamente sea Carla
va a ser Carla Ibón y los demás valores van a ser los mismos el apellido
va a ser Gomes
el e-mail cagones arroba mail puntocom
y el teléfono
podemos copiarlo para que sea el mismo obviamente aquí podemos aprovechar para realizar cambios en cualquier
atributo del objeto y lo que vamos a hacer es actualizar este objeto en la base de datos por lo tanto
proporcionamos todo el objeto cambio persona
bien.
Aquí ya hicimos el update pero ahora lo que vamos a hacer es que dentro de esta misma transacción vamos
a hacer también un insert.
Recordemos que una transacción es ejecutar varias sentencias SQL pero obviamente las que más nos interesan
son las que modifican el estado de la base de datos.
Por ejemplo un Select.
No es necesario crear una transacción ya que no afecta al estado de la base de datos pero las sentencias
de update Incer y Lilit afectan el estado de la base de datos ya que cambian la información de nuestras
tablas y por lo tanto vamos a ejecutar otra sentencia en este caso para insertar un nuevo registro mandamos
a llamar.
El método insert y creamos una nueva persona
creamos la variable nueva persona o persona
y asignamos los valores recordemos que como es una nueva persona no especificamos el Heydi así que ponemos
el nombre Carlos
ponemos el apellido
Ramírez y vamos a dejar los demás valores por default.
Su valor por default va a ser nulo así que si no nos especificamos no hay ningún problema pero van a
quedar con el valor de Nul bien y hasta aquí lo que estamos haciendo entonces es ejecutar la sentencia
UPDATE y posteriormente la sentencia INSERT todo dentro de la misma transacción y finalmente si todo
funciona entonces hacemos commit de la transacción así que para ello usamos nuestro objeto conexión
y mandamos a llamar.
El método commit hasta este momento es que se van a guardar los cambios ya que hemos modificado estos
métodos para que no se haga commit de la transacción de manera automática sino hasta que decidamos con
el objeto conexión hacemos el comité.
Por ello fue que al inicio establecimos el valor de ser autofoco igual a Fool's para que no se haga
de manera automática así que en caso de error imprimimos lo siguiente
entramos al rol VAC se imprime la excepción a la consola sin embargo la variable conexión debe de estar
declarada fuera de este bloque para que podamos utilizarla.
De lo contrario no vamos a poder mandar a llamar.
El método roll back así que esta variable de conexión
se instancia dentro del bloque pero se define fuera de este bloque
la inicializar con el valor de Nul y posteriormente ya empezamos a utilizar le asignamos el valor de
una conexión pero deberá estar declarada fuera del bloque 30h para que podamos utilizar esta variable
dentro del bloque cazzo.
Ahora sí podemos hacer la llamada al método roll back.
Sin embargo este método en sí mismo puede arrojar también una excepción.
Por lo tanto volvemos a envolver la llamada a este método dentro de un bloque y cazzo y mandamos a imprimir
esta acepción que es la variable excepción.
1 mandamos a imprimir la acepción en dado caso de que ocurra si ejecutamos nuestro código tal cual lo
estamos observando debería funcionar sin ningún problema.
Sin embargo lo que queremos mostrar es que si este código falla entonces no se va a hacer ni el update
ni tampoco se va a hacer el insert ya que toda la transacción debería de entrar al bloque de rol back.
Ahora para demostrar esto necesitamos que ocurra algún fallo dentro de alguna de las sentencias así
que vamos a provocar un fallo en el insert del apellido de la nueva persona para provocar este fallo
lo que vamos a hacer es agregar más de 45 caracteres en el largo del apellido así que vamos a escribir
bastantes caracteres si seleccionamos esta cadena podemos observar en esta parte inferior el número
de caracteres que llevamos escritos en esta cadena así que ya llevamos 51 caracteres.
Por lo tanto simplemente con pasar más de 45 caracteres entonces va a ocurrir un fallo ya que recordemos
que cuando creamos la base de datos si vamos a la estructura dentro de mi círculo Workbench
vamos a revisar la estructura de la tabla de persona damos derecho Alter Taiba y podemos observar que
los campos de tipo string tienen como máximo 45 caracteres es un parchar de 45 caracteres como máximo
así que si queremos insertar una cadena con más de 45 caracteres entonces va a ocurrir un error.
Por lo tanto en este caso el update va a funcionar correctamente va a ser el cambio al nombre de Carla
por Carla Ivón pero el insert no se va a ejecutar y debido a que estamos dentro de una transacción entonces
en lugar de hacer de toda la transacción va a ser roll back.
Por lo tanto no va a guardar ni los cambios de los datos ni tampoco el insert así que eso es lo que
significa hacer roll back de una transacción.
Todas las sentencias que modifican el estado de la base de datos no se van a ejecutar pero si todo funciona
correctamente entonces todos los cambios se guardan correctamente en la base de datos.
Esto al hacer de toda la transacción.
Sin embargo aquí tengo un error antes de ejecutar nuestro código aquí debe de ser nueva persona de lo
contrario estaríamos insertando el mismo registro que estamos modificando pero no queremos insertar
una nueva persona.
Hasta aquí ya tenemos todos los cambios dentro de la clase de manejo personas.
Sin embargo falta hacer un cambio más dentro de los métodos Toit insert etcétera de nuestra clase persona
JDBC debemos de quitar el manejo de excepciones que hemos agregado ya que de lo contrario no se va a
arrojar esta excepción y por lo tanto no vamos a poder hacer roll back ya que si este método update
se encarga de procesar la excepción entonces nunca se va a arrojar la excepción así que vamos a cada
uno de los métodos quitamos el bloque catch
y únicamente se va a quedar el bloque final y
sin embargo esto provoca que en automático este método deba indicar que puede arrojar una excepción
así que la acepción que pueda arrojar es una excepción de tipo ese cual exception.
Así que seleccionamos la opción de AB trasquilados for se cuele SQL exception para que el método en
dado caso de que suceda algún error reporte esta excepción y no la procese internamente ya que de lo
contrario no se va a enterar la clase externa donde se está abriendo la conexión que ocurrió una excepción
y hacemos lo mismo en cada uno de los métodos.
No debe de procesar la excepción directamente.
Esta clase
sino que propagados la excepción
así que el método ahora arroja throws ese cueles Epsom propaga la excepción de tipo SQL
de igual manera.
Este método de propagar la excepción y finalmente el método delito
propaga esta excepción
y así cada uno de los métodos ya no procesa la decepción internamente sino que la propaga y la va a
propagar hacia esta clase que es la que se está encargando de procesar.
El manejo de transacciones así que ya tenemos el código para hacer el update y el código para hacer
el insert bien así que vamos a ejecutar nuestro código.
Damos clic derecho Rum File
y podemos observar que se está arrojando la excepción pero ahora centro al rol back así que después
de cachar la acepción que se está arrojando en este caso el campo de columna de apellido es muy largo
data Tun log nos pasamos de largo en este caso más de 45 caracteres y se arroja la excepción y por lo
tanto entramos al rol back aunque se ejecutó la sentencia del update correctamente ya que en esta sentencia
no hay ningún error en la sentencia del insert.
Si hay un error y por lo tanto se cerró el back de las dos sentencias vamos a revisar el estado de la
base de datos
damos clic en refresh y podemos observar que el update no se realizó.
No tenemos el nombre de Carla Ibón dentro de la base de datos a pesar de que esa sentencia era correcta
no se alteró el estado de la base de datos.
Ahora vamos a hacer un cambio donde no ocurra una excepción
ponemos nueva persona Seth apellido y ponemos un apellido válido
el apellido de Ramírez.
Y debido a que ahora si tanto el update como el insert deberían de funcionar correctamente entonces
se debería de modificar correctamente el estado de la base de datos y aquí vamos a mandar un mensaje
de que se ha hecho de la transacción.
Vamos a comprobarlo damos clic derecho Broomfield
y podemos observar que sea ejecutado tanto el Uday como el insert nos muestra el número de registros
modificados y además nos muestra al final se ha hecho el comité de la transacción.
Revisamos el estado de la base de datos hacemos refresh y podemos observar que el nombre se ha modificado
de Karla a Karla Ivón y se ha insertado un nuevo registro en la base de datos.
Recordemos que este Heydi no tiene que ser exactamente el mismo ya que se maneja de manera automática
y tampoco debe de ser secuencial así que depende del número de pruebas que vayan haciendo.
Este valor puede cambiar pero ya tenemos el nombre de Carlos el apellido Ramírez y como no especificamos
ni el email ni el teléfono.
Estos campos quedaron con los valores de Nul bien así que con esto ya funcionó correctamente el manejo
de transacciones.
Básicamente lo que hicimos todo el trabajo más complicado fue modificar nuestra clase persona JDBC para
que pueda recibir una conexión externan y en dado caso si esta conexión externa se ha proporcionado
en el constructor de esta clase entonces ya no tiene que instancia una conexión de manera interna y
por lo tanto tampoco cerrarla por ello es que agregamos estas dos líneas de código pero además también
eliminamos el bloque cache en cada uno de los métodos para que en lugar de que se procese la excepción
dentro de estos métodos se propague esta excepción y así podamos hacer o roll back de la transacción
que estamos trabajando bien.
Eso es todo respecto al manejo de transacciones y nos vemos en la siguiente elección.
Saludos.