Saltar la navegación

6.- Transacciones.

Caso práctico

Ana.
Ministerio de Educación. (Uso Educativo nc)



Ana ha estado haciendo algunas pruebas del funcionamiento de la aplicación y ha observado un error: Con los créditos que dispone un determinado usuario ha empezado la creación de una nueva partida, pero antes de finalizar el proceso de creación de la partida ha utilizado un botón "Cancelar" para simular que el usuario ha optado por dar marcha atrás en la creación de la partida. En ese caso, el crédito del usuario debería permanecer inalterado, ya que no ha finalizado el proceso de creación de la partida, pero ha observado los datos que hay en la base de datos y se encuentra con que el crédito del usuario se ha decrementado.

Al comentarle el problema a Juan, éste le comenta que debe gestionar ese proceso utilizando transacciones.

Una transacción es una unidad atómica (no se puede dividir) de trabajo que contiene una o más sentencias SQL. Las transacciones agrupan sentencias SQL de tal manera que a todas ellas se le aplica una operación COMMIT, que podríamos traducir como confirmadas, aplicadas o guardadas en la base de datos, o bien a todas ellas se les aplica la acción ROLLBACK, que interpretamos como deshacer las operaciones que deberían hacer sobre la base de datos.

Un ejemplo de transacción sería el proceso de transferencia entre cuentas bancarias. Supongamos que Juan hace una transferencia de 100 euros de su cuenta a la de María. Básicamente, las operaciones a realizar en las tablas serías:

  1. Actualizar la cuenta de Juan restándole al saldo 100 euros
  2. Registrar el movimiento de decremento de 100 euros en los movimientos de la cuenta de Juan
  3. Actualizar la cuenta de María incrementándola con 100 euros
  4. Registrar el movimiento de incremento de 100 euros en los movimientos de la cuenta de María.

¿ Qué pasaría si hubiese un corte o caída en el sistema después de efectuarse el punto 2?. ¿ Dónde estarían esos 100 euros? Juan ya no los tiene, pero María tampoco.

Para evitar situaciones de estas se utilizan las transacciones, de forma que las 4 operaciones sean consideradas como una única operación y, o se realizan las 4, o no se realiza ninguna, es decir, hasta que no estén las 4 realizadas, no se confirma (COMMIT) la operación. Si hay problemas antes de que se realicen las 4, se deshacen (ROLLBACK)  las operaciones hechas que han dejado a medias el proceso.

Como ves, esta característica da robustez y seguridad a un SGBD asegurando la consistencia de los datos. El SGBD Oracle es el más potente a nivel transaccional.

Mientras que sobre una transacción no se haga COMMIT, los resultados de ésta pueden deshacerse. El efecto de una sentencia del lenguaje de manipulación de datos (DML) no es permanente hasta que se hace la operación COMMIT sobre la transacción en la que esté incluida o hasta que se ejecuta una operación DDL.

Las transacciones de Oracle cumplen con las propiedades básicas de las transacciones en base de datos:

  • Atomicidad: Todas las tareas de una transacción son realizadas correctamente, o si no, no se realiza ninguna de ellas. No hay transacciones parciales. Por ejemplo, si una transacción actualiza 100 registros, pero el sistema falla tras realizar 20, entonces la base de datos deshace los cambios realizados a esos 20 registros.
  • Consistencia: La transacción se inicia partiendo de un estado consistente de los datos y finaliza dejándola también con los datos consistentes.
  • Aislamiento: El efecto de una transacción no es visible por otras transacciones hasta que finaliza.
  • Durabilidad: Los cambios efectuados por las transacciones que han volcado sus modificaciones, se hacen permanentes.

Las sentencias de control de transacciones gestionan los cambios que realizan las sentencias DML y las agrupa en transacciones. Estas sentencias te permiten realizar las siguientes acciones:

  • Hacer permanentes los cambios producidos por una transacción (COMMIT).
  • Deshacer los cambios de una transacción (ROLLBACK) desde que fue iniciada o desde un punto de restauración (ROLLBACK TO SAVEPOINT). Un punto de restauración es un marcador que puedes establecer dentro del contexto de la transacción. Debes tener en cuenta que la sentencia ROLLBACK finaliza la transacción, pero ROLLBACK TO SAVEPOINT no la finaliza.
  • Establecer un punto intermedio (SAVEPOINT) a partir del cual se podrá deshacer la transacción.
  • Indicar propiedades para una transacción (SET TRANSACTION). Por ejemplo podemos elegir READ ONLY y no se permitirán modificaciones.
  • Especificar si una restricción de integridad aplazable se comprueba después de cada sentencia DML o cuando se ha realizado el COMMIT de la transacción (SET CONSTRAINT) podemos elegir IMMEDIATE o DEFERRED, es decir, se comprueba la transacción inmediatamente después de cada orden DML o cuando haya sido confirmada

Se dice que una operación es atómica cuando es imposible para otra parte de un sistema encontrar pasos intermedios. Si esta operación consiste en una serie de pasos, todos ellos ocurren o ninguno. Por ejemplo en el caso de una transacción bancaria o se ejecuta tanto el deposito y la deducción o ninguna acción es realizada.

asegura que cada usuario tiene una vista consistente de los datos, incluyendo los cambios visibles realizados por las transacciones del mismo usuario y las transacciones finalizadas de otros usuarios. Asegura que los datos que estás siendo consultados o modificados por un usuario no pueden ser cambiados por otros hasta que el usuario haya finalizado la operación completa

El efecto de una transacción no es visible por otras transacciones hasta que finaliza.

Los cambios efectuados por las transacciones que han volcado sus modificaciones, se hacen permanentes.

Transferir los datos desde un sistema de almacenamiento de datos a otro, normalmente desde la memoria principal al disco duro

Forma de implementar subtransacciones (también conocidas como transacciones anidadas) dentro de un sistema gestor de base de datos relacional indicando un punto dentro de una transacción de base de datos que puede ser devuelta sin afectar a cualquier trabajo realizado en la transacción antes de que el punto de recuperación fuera creado. Varios puntos de restauración pueden existir dentro de una transacción individual. Los puntos de restauración son útiles para implementar recuperación de errores complejos en aplicaciones de base de datos. Si ocurre un error en el medio de una transacción de múltiples sentencias, la aplicación puede ser capaz de recuperarse del error (volviendo hasta un punto de restauración) sin necesidad de abortar la transacción completa.