Punto de guardado (SQL)

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 28 de enero de 2022; las comprobaciones requieren 3 ediciones .

Savepoint (del punto de guardado - punto de guardado en inglés  ) es una instrucción SQL que divide una transacción en puntos de guardado lógicos. También es una forma de implementar subtransacciones (llamadas transacciones anidadas) en un sistema de administración de bases de datos relacionales especificando un punto dentro de una transacción que se puede "revertir" sin afectar el trabajo realizado en la transacción antes de que se creara el punto de guardado. Puede haber múltiples puntos de guardado dentro de una sola transacción. Los puntos de guardado son útiles para implementar la recuperación de errores complejos en aplicaciones de bases de datos. Si se produce un error durante una transacción de múltiples operaciones, la aplicación puede recuperarse del error (regresando a un punto de guardado) sin tener que cancelar toda la transacción. Plataformas compatibles:

Sintaxis SQL

Un punto de guardado se puede declarar de la siguiente manera (usando la instrucción SAVEPOINT ).

SAVEPOINT nombre del punto de guardado

Se establece un punto de guardado llamado 'savepoint_name' en la transacción actual. Algunos proveedores le permiten usar puntos de guardado con el mismo nombre en una transacción, pero el estándar ANSI no recomienda hacerlo.

Todos los cambios realizados después de que se declaró el punto de guardado se pueden deshacer emitiendo el comando:

VOLVER A savepoint_name _

Para eliminar uno o más puntos de guardado, use el comando:

RELEASE SAVEPOINT nombre del punto de guardado

Es importante tener en cuenta que todos los puntos de guardado que se crearon después del especificado también se eliminarán.

Cómo los Puntos de guardado [

Un punto de guardado (en lo sucesivo, TS) es una estructura de datos ubicada en la memoria dinámica del servidor (en el grupo de transacciones) y que tiene un identificador numérico único. Cada vehículo tiene una lista de acciones realizadas en su contexto (el llamado registro de deshacer o registro de deshacer). Dentro de una transacción, los TS forman una pila y, por lo tanto, su reversión siempre es posible solo de forma secuencial. Los fragmentos del registro de deshacer se distribuyen entre los TO, que almacenan de forma incremental el historial de todos los cambios realizados en el contexto de la transacción.

Un punto de guardado que está activo en el momento en que se cambia un registro se denomina punto de guardado actual. La información sobre cómo cambiar la entrada se coloca en el registro de cancelación del vehículo actual. En caso de que se inicie una reversión al TS, el registro de deshacer se desenrolla en la dirección opuesta, reconstruyendo el registro a la forma en que existía en el momento de la instalación de este TS. Después de la reconstrucción de todos los registros modificados, el TS generalmente se elimina del contexto de la transacción. Si no hay controladores de excepciones en el contexto del TS actual, este proceso puede repetirse, cancelando los cambios al TS superior. Además de la operación de retroceder al TS, también existe la operación de eliminación regular (liberación) del TS. Si se elimina un vehículo, su registro de deshacer se fusiona con el registro de deshacer del anterior en la pila del vehículo. En vista de lo anterior, podemos hablar del anidamiento del TS.

Consejos y notas sobre el uso

Los puntos de guardado se establecen dentro de la transacción en la que se definen. Los nombres de los puntos de guardado deben ser únicos dentro de estos límites. Utilice las declaraciones BEGIN y COMMIT con cuidado, porque si accidentalmente coloca una declaración BEGIN demasiado pronto o una declaración COMMIT demasiado tarde, puede afectar en gran medida la forma en que se escriben las transacciones en la base de datos. Asegúrese de elegir nombres significativos para sus puntos de guardado, ya que se referirá a ellos más adelante en sus programas. Reutilizar un nombre de punto de guardado no dará como resultado un error o una advertencia. La duplicación de un nombre hará que un punto de guardado anterior con el mismo nombre no funcione. ¡Tenga cuidado al elegir los nombres de los puntos de guardado! Cuando se inicia una transacción, se gastan recursos (a saber, bloqueos) que garantizan la integridad de las transacciones. Su transacción debe completarse lo antes posible para que se liberen los bloqueos y otros usuarios puedan usar los recursos.

Ejemplo

Para retroceder a un punto de guardado después de que se hayan realizado algunas modificaciones, ingrese los siguientes comandos:

INSERTAR EN VALORES de ventas ( 7896 ', ' JR3435 ', '28 de octubre de 1997 ', 25, ' Net 60 ', ' BU7832 '); SAVEPOINT after_insert; ACTUALIZAR sales SET terms=' Net 90 ' WHERE sales_id=' 7896 ' ; SAVEPOINT after_update ; ELIMINAR ventas ; VOLVER A after_insert ;

Como podemos ver, es el comando ROLLBACK el que retrocede al punto de guardado llamado 'after_insert'.

También un ejemplo de que podemos crear múltiples puntos de guardado (en el ejemplo, se establecen dos puntos de guardado, a los que podemos regresar usando el comando ROLLBACK ):

ACTUALIZAR empleados SET salario = 7000 WHERE last_name = 'Banda' ; SAVEPOINT banda_sal ; ACTUALIZAR empleados SET salario = 12000 WHERE last_name = 'Greene' ; GUARDAR PUNTO greene_sal ; SELECCIONE SUMA ( salario ) DE empleados ; VOLVER A SAVEPOINT banda_sal ; ACTUALIZAR empleados SET salario = 11000 WHERE last_name = 'Greene' ; COMISIONAR ;

Un ejemplo de eliminación de un punto de retorno (el ejemplo muestra claramente el funcionamiento del comando RELEASE SAVEPOINT ):

INSERTAR autores ( au_id , au_lname , au_fname , contract ) VALORES ( '111-11-1111' , 'Rabbit' , 'Jessica' , 1 ); SAVEPOINT first_savepoint ; INSERTAR autores ( au_id , au_lname , au_fname , contract ) VALORES ( '277-27-2777' , 'Fudd' , 'EP' , 1 ); SAVEPOINT segundo_punto de guardado ; INSERTAR autores ( au_id , au_lname , au_fname , contract ) VALORES ( '366-36-3636' , 'Duck' , 'PJ' , 1 ); SAVEPOINT tercer_punto de guardado ; LIBERAR SAVEPOINT segundo_savepoint ; COMISIONAR ;

En este ejemplo, cuando se elimina el segundo punto de guardado, el sistema realmente elimina el segundo y el tercer punto de guardado porque el tercer punto de guardado se creó después del segundo punto de guardado. Después de eliminar un punto de guardado, se puede volver a utilizar su nombre.

Características del comando SAVEPOINT

ÚNICO

Especifica que una aplicación no puede reutilizar un nombre de punto de guardado en una unidad de recuperación. Si ya existe un punto de guardado con el mismo nombre que el nombre del punto de guardado en el bloque de recuperación, se producirá un error. Omitir ÚNICO indica que la aplicación puede reutilizar el nombre del punto de guardado dentro de la unidad de recuperación. Si svpt-name identifica un punto de guardado que ya existe en la unidad de recuperación y el punto de guardado no se creó con la opción ÚNICA, el punto de guardado existente se destruirá y se creará un nuevo punto de guardado. Destruir un punto de guardado para reutilizar su nombre no es lo mismo que liberar un punto de guardado. Reutilizar un nombre de punto de guardado destruye solo un punto de guardado. Puede liberar un punto de salvaguarda mediante la declaración RELEASE SAVEPOINT, que liberará el punto de salvaguarda, así como cualquier punto de salvaguarda que se haya establecido posteriormente.

ON ROLLBACK RETAIN CURSORS

Especifica que los cursores que se abren después de guardar el punto de guardado no se rastrean y, por lo tanto, no se cierran al retroceder al punto de guardado. Aunque estos cursores permanecen abiertos después de una reversión a un punto de guardado, es posible que no se utilicen. Por ejemplo, si una reversión a un punto de guardado provoca una inserción de la fila donde se colocó el cursor para revertir, entonces usar el cursor para actualizar o eliminar la fila genera un error.

ON ROLLBACK RETAIN LOCKS

Especifica que los bloqueos adquiridos desde que se guardó el punto de guardado no se rastrean y, por lo tanto, no se descartan cuando se revierte el punto de guardado. ON ROLLBACK RETAIN LOCKS es el comportamiento predeterminado.

Literatura

Enlaces

  • [1] , Base de datos de referencia SQL, Oracle
  • [2] , DB2 SQL, IBM