4.1. Rollback y Commit

En tecnologías de base de datos, un rollback es una operación que devuelve a la base de datos a algún estado previo. Los Rollbacks son importantes para la integridad de la base de datos, a causa de que significan que la base de datos puede ser restaurada a una copia limpia incluso después de que se han realizado operaciones erróneas. Son cruciales para la recuperación de caidas de un servidor de base de datos; realizando rollback(devuelto) cualquier transacción que estuviera activa en el tiempo del crash, la base de datos es restaurada a un estado consistente.

En SQL, ROLLBACK es un comando que causa que todos los cambios de datos desde la última sentencia BEGIN WORK, o START TRANSACTION sean descartados por el sistema de gestión de base de datos relacional (RDBMS).

Una sentencia ROLLBACK también publicará cualquier savepoint existente.

En muchos dialectos de SQL, ROLLBACKs son específicos de la conexión. Esto significa que si se hicieron dos conexiones a la misma base de datos, un ROLLBACK hecho sobre una conexión no afectará a cualesquiera otras conexiones. Esto es vital para el buen funcionamiento de la Concurrencia.

La funcionalidad de rollback está normalmente implementada con un Log de transacciones, pero puede también estar implementada mediante control de concurrencia multiversión.

Ejemplo SQLSERVER 2008

Para acceder al modo consola de SQL SERVER, se debe abrir una ventana de comando y ejecutar el comando SQLCMD con los siguientes parámetros

A continuación se muestra un ejemplo de conexión

Creamos una tabla de trabajo

El siguiente ejemplo muestra como Rollback afecta una transacción


ROLLBACK WORK

Esta instrucción funciona de forma idéntica a ROLLBACK TRANSACTION, con la diferencia de que ROLLBACK TRANSACTION acepta nombres de transacción definidos por el usuario.Se especifique o no la palabra clave opcional WORK, esta sintaxis de ROLLBACK es compatible con ISO.

Al anidar transacciones, ROLLBACK WORK siempre revierte las transacciones hasta la instrucción BEGIN TRANSACTION más externa y disminuye la función del sistema @@TRANCOUNT a 0.

Permisos

Los permisos ROLLBACK WORK corresponden, de forma predeterminada, a cualquier usuario válido.

COMMIT

Marca el final de una transacción correcta, implícita o explícita

Ejemplo

Ejemplo básico en MySQL precio del dolar con respecto al peso 1995 a marzo 18 del 2014.

CREATE TABLE IF NOT EXISTS dolar (
fecha DATE,
precio DECIMAL (8,4),
PRIMARY KEY (fecha)
) ENGINE = InnoDB DEFAULT CHARSET=latin1;

Considere la siguiente información


Fecha Precio
2012/02/0113.0077
2012/02/0212.8900
2012/02/0312.8038
2012/02/0712.7120
2012/02/0812.6472
2012/02/0912.6833
2012/02/1012.7200

Lectutas consistentes


Por default, las tablas InnoDB ejecutan un lectura consistente (consistent read). Esto significa que cuando una sentencia SELECT es ejecutada, MySQL regresa los valores presentes en la base de datos hasta la transacción más reciente que ha sido completada. Si alguna transacción está en progreso, los cambios hechos por alguna sentencia INSERT o UPDATE no serán reflejados. Sin embargo, existe una excepción: las transacciones abiertas si pueden ver sus propios cambios. Para demostrar esto, necesitamos establecer dos conexiones al servidor MySQL.


Observe el caso feliz de las transacciones. Sin violaciones de integridad referencial o otra clase de errores


Cliente 1 Cliente 2
SET AUTOCOMMIT = 0
INSERT INTO dolar VALUES('2012-02-01', 13.0077);
INSERT INTO dolar VALUES('2012-02-02', 12.8900);
INSERT INTO dolar VALUES('2012-02-03', 12.8038);
SELECT * FROM dolar WHERE fecha >= '2012/02/01';
SET AUTOCOMMIT = 0
INSERT INTO dolar VALUES('2012-02-07', 12.7120);
INSERT INTO dolar VALUES('2012-02-08', 12.6472);
INSERT INTO dolar VALUES('2012-02-09', 12.6833);
INSERT INTO dolar VALUES('2012-02-10', 12.7200);
SELECT * FROM dolar WHERE fecha >= '2012/02/01';

COMMIT; SELECT * FROM dolar WHERE fecha >= '2012/02/01';
 


Por defecto, MySQL se ejecuta con el modo autocommit activado. Esto significa que en cuanto ejecute un comando que actualice (modifique) una tabla, MySQL almacena la actualización en disco.


Si usa tablas transaccionales (como InnoDB o BDB), puede desactivar el modo autocommit con el siguiente comando: SET AUTOCOMMIT = 0;


Tras deshabilitar el modo autocommit poniendo la variable AUTOCOMMIT a cero, debe usar COMMIT para almacenar los cambios en disco o ROLLBACK si quiere ignorar los cambios hechos desde el comienzo de la transacción.


START TRANSACTION


El siguiente código crea una tabla InnoDB de nombre resumen;


CREATE TABLE resumen (
  year     INTEGER,
  mes      INTEGER,
  promedio DECIMAL(8,4),
  PRIMARY KEY (year, mes)
)engine = innodb;

Cliente 1 Cliente 2
START TRANSACTION;
SELECT @prom:= AVG(precio) FROM dolar
WHERE YEAR(fecha) = 2011 AND MONTH(fecha) = 1;
INSERT INTO resumen VALUES (2011, 1, @prom);
SELECT * FROM resumen;

SELECT @prom:= AVG(precio) FROM dolar
WHERE YEAR(fecha) = 2011 AND MONTH(fecha) = 2;
INSERT INTO resumen VALUES (2011, 2, @prom);
SELECT * FROM resumen;

SELECT * FROM resumen;

COMMIT;
SELECT * FROM resumen;

SELECT * FROM resumen;



Anterior
Valid XHTML
home

Siguiente