Saltar la navegación

12.- Gestión de transacciones.

Caso práctico

Juan está muy contento con la implementación de la interacción de la aplicación con la base de datos. El uso de clases y objetos que de forma transparente realizan las operaciones con las base de datos, supone un gran ventaja en la programación de aplicaciones con acceso a bases de datos. Sin embargo le surge una duda, ¿qué ocurre si hay varios accesos simultáneos a un determinado datos, uno para consultar y otro para actualizarlo? ¿Cómo se pueden gestionar la transacciones?

Fotografía de Juan con camisa.

Imagen donde aparecen dos pantalla de ordenador, con un operario interactuando con ellas.

Un transacción es un conjunto de órdenes que se ejecutan formando un unidad de trabajo, en forma indivisible o atómica.

Para la gestión de transacciones en Hibernate, no se produce bloqueo de objetos en la memoria. La aplicación puede esperar el comportamiento definido por el nivel de aislamiento de sus transacciones de las bases de datos. Gracias a la Session, la cual también es un caché con alcance de transacción. Para realizar con éxito la gestión de transacciones, ésta se van a basar en el uso del objeto Session.

El objeto Session se obtiene a partir de un objeto SessionFactory ,invocando el método openSession. Un objeto SessionFactory representa una configuración particular de un conjunto de metadatos de mapping objeto/relaciona.

Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = null;
try 
{
          tx = session.beginTransaction();
// Utilizar la Session para saveOrUpdate/get/delete/...tx.commit();
} catch (Exception e) 
{
          if (tx != null) 
          {
               tx.rollback();
               throw e;
          }
} finally {
          session.close();
}// Al finalizar la aplicación ...HibernateUtil.shutdown( );

Cuando se crea el objeto Session , se le asigna la conexión de la base de datos que va a utilizar. Una vez obtenido el objeto Session , se crea una nueva unidad de trabajo ( Transaction) utilizando el método beginTransaction. Dentro del contexto de la transacción creada, se pueden invocarlos métodos de gestión de persistencia proporcionados por el objeto Session, para recuperar, añadir, eliminar o modificar el estado de instancias de clases persistentes. También se pueden realizar consultas. Si las operaciones de persistencia no han producido ninguna excepción, se invoca el método commit de la unidad de trabajo para confirmar los cambios realizados. En caso contrario, se realiza un rollback para deshacer los cambios producidos. Sobre un mismo objeto Session pueden crearse varias unidades de trabajo. Finalmente se cierra el objeto Session invocando su método close.