RELEASE SAVEPOINT - SAVEPOINT
Los SAVEPOINTs son un método para crear transacciónes, similares a BEGIN y COMMIT, excepto porque las sentencias SAVEPOINT y RELEASE tienen nombre y pueden ser anidadas.
La sentencia SAVEPOINT inicia una nueva transacción con un nombre. Es necesario que los nombres de transacción sean únicos. Un SAVEPOINT puede ser iniciado tanto dentro como fuera de un BEGIN... COMMIT. Cuando un SAVEPOINT es el más exterior y no está en el interior de un BEGIN...COMMIT, entonces sl comportamiento es el mismo que BEGIN DEFERRED TRANSACTION.
La sentencia ROLLBACK TO revierte el estado de la base de datos a su estado en que estaba en el correspondiente SAVEPOINT. Hay que tener en cuenta que al contrario que la sentencia ROLLBACK (sin la palabra clave TO) la sentencia ROLLBACK TO no cancela la transacción. En lugar de cancelar la transacción, la sentencia ROLLBACK TO restablece la transacción al comienzo. Sin embargo, se cancelan todos los SAVEPOINT que intervienen.
La sentencia RELEASE equivale a una sentencia COMMIT para un SAVEPOINT. La sentencia RELEASE elimina de la pila de transacciones todos los puntos rescate desde el más reciente con el nombre especificado. La sentencia RELEASE en el interior de una transacción no hace que se escriba ningún cambio en el fichero de la base de datos; sólo elimina los puntos de rescate de la pila de transacciones de modo que ya no sea posible hacer un ROLLBACK TO a esos puntos de rescate. Si una sentencia RELEASE libera el punto de rescate más externo, de modo que la pila de transaciones quede vacía, ese RELEASE equivale a un COMMIT. Una sentencia COMMIT se puede usar para liberar todos los puntos de rescate y ejecutar la transacción aunque esta haya sido iniciada originalmente con una sentencia SAVEPOINT en lugar de con una sentencia BEGIN.
Si el nombre del punto de rescate en una sentencia RELEASE no coincide con ninguno de los que hay actualmente en la pila de transacciones, no habrá puntos de retorino a liberar, la base de datos permanece inalterada y la sentencia RELEASE retorna con un error.
Hay que tener en cuenta que se puede ejecutar una transacción interna (usando la sentencia RELEASE) pero que más tarde puede ser deshecha mediante un ROLLBACK de una transacción más externa. Un fallo de alimentación o un crash del programa o del sistema operativo puede provocar un rollback de la transacción más externa, deshaciendo todos los cambios realizados dentro de esa transacción externa, incluso los cambios que supuestamente se hubieran ejecutado mediante la sentencia RELEASE. El contenido no se actualiza en el disco hasta que se ejecute la transacción más externa.
Hay varias formas de pensar sobre la sentecia RELEASE:
- Algunas personas consideran un RELEASE como el equivalente de un COMMIT para un SAVEPOINT. Es un buen punto de vista, sienpre que se recuerde que los cambios realizados por una transacción interna pueden ser anulados más tarde por un ROLLBACK externo.
- Otro punto de vista es que la transacción con nombre se funde con su transacción principal, de modo que la transacción con nombre y su transacción padre se convierten en la misma transacción. Después del RELEASE, la transacción con nombre y su transacción padre pueden ejecutarse o deshacerse juntas, independientemente de cual sea su destino.
- También se puede pensar en los puntos de rescate como "marcas" en la línea de tiempo de la transacción. Desde este punto de vista, la sentencia SAVEPOINT crea una nueva marca, la sentencia ROLLBACK retrocede en la línea de tiempo hasta el punto posterior a la marca con ese nombre, y la sentencia RELEASE borra las marcas de la línea de tiempo sin tener que realizar ningún cambio en la base de datos.
Reglas para las transacciones anidadas
La última transacción comenzada es la primera en completarse o en retroceder.
La sentencia BEGIN sólo funciona si la pila de transacciones está vacía, o en otras palabras si no hay transacciones pendientes. Si la pila de transacciones no está vacía cuando la sentencia BEGIN es invocada, entonces la sentecia falla con un error.
La sentencia COMMIT ejecuta todas las transacciones pendientes y deja la pila de transacciones vacía.
La sentencia RELEASE comienza con la incorporación más reciente a la pila de transacciones y sigue liberando puntos de rescate hacia atrás en el tiempo hasta que libera el punto de rescate con el nombre indicado. Los puntos de rescate anteriores, incluidos los que tienen nombres que coincidan con el indicado, permanecen inalterados. Si la sentencia RELEASE provoca que la pila de transacciones quede vacía (si ejecuta la transacción más externa de la pila), entonces la transacción se completa.
La sentencia ROLLBACK sin la cláusula TO deshace todas las transacciones y deja la pila de transacciones vacía.
La sentencia ROLLBACK con la cláusula TO deshace las transacciones yendo hacia atrás en la línea de tiempos hasta el SAVEPOINT más reciente el nombre indicado. El punto de SAVEPOINT con el nombre indicado permanece en la pila de transacciones, pero todos los cambios que se hayan realizado después de que se creara en SAVEPOINT se deshacen. Si el nombre del punto de rescate en la sentencia ROLLBACK TO no coincide con ningún SAVEPOINT de la pila, la sentencia falla con un error y deja el estado de la base de datos sin cambios.