jueves, 11 de abril de 2013

ROLLBACK,COMMIT Y RECOVERY


                                               ROLLBACK

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 crashes 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), para que el estado de los datos sea "rolled back"(devuelto) a la forma en que estaba antes de que aquellos cambios tuvieran lugar.

Una sentencia ROLLBACK también publicará cualquier savepoint existente que puediera estar en uso.

                               COMMIT

En el contexto de la Ciencia de la computación y la gestión de datos, commit (acción de comprometer) se refiere a la idea de consignar un conjunto de cambios "tentativos, o no permanentes". Un uso popular es al final de una transacción de base de datos.

Una sentencia COMMIT en SQL finaliza una transacción de base de datos dentro de un sistema gestor de base de datos relacional (RDBMS) y pone visibles todos los cambios a otros usuarios. El formato general es emitir una sentencia BEGIN WORK, una o más sentencias SQL, y entonces la sentencia COMMIT. Alternativamente, una sentenciaROLLBACK se puede emitir, la cual deshace todo el trabajo realizado desde que se emitió BEGIN WORK. Una sentencia COMMIT publicará cualquiera de los savepoints (puntos de recuperación) existentes que puedan estar en uso.

En términos de transacciones, lo opuesto de commit para descartar los cambios "en tentativa" de una transacción, es un rollback.

                        RECOVERY

El concepto de integridad de datos va mas alla de prevenir que los programas del usuario almacenen datos incorrectos.En caso de errores de desastres,también podríamos perder la integridad de los datos. SGBD nos debe dar las herramientas para reconstruir o restaurar los datos estropeados.

Los procesos de restauración (restore o recovery) de los que SGBD dispone  para poder reconstruir la BD y darle el estado consistente y correcto anterior al incidente. Esto se acostumbra a hacer gracias a la obtencionde copias periodicas de los datos (se denominan copias de seguridad o back-up) y mediante el mantenmiento continuo de un diario (log) donde el SGBD va anotando todas las escrituras que se hacen en la BD.

 

MYSQL

mysql> CREATE TABLE innotest (campo INT NOT NULL PRIMARY KEY) TYPE = InnoDB;

Query OK, 0 rows affected (0.10 sec)

mysql> INSERT INTO innotest VALUES(1);

Query OK, 1 row affected (0.08 sec)

mysql> INSERT INTO innotest VALUES(2);

Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO innotest VALUES(3);

Query OK, 1 row affected (0.04 sec)

mysql> SELECT * FROM innotest;

 

+-------+

| campo |

+-------+

|     1 |

|     2 |

|     3 |

+-------+

3 rows in set (0.00 sec)

 

De acuerdo, nada espectacular. Ahora se verá como usar transacciones.

 

mysql> BEGIN;

Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO innotest VALUES(4);

Query OK, 1 row affected (0.00 sec)

 

mysql> SELECT * FROM innotest;

 

+-------+

| campo |

+-------+

|     1 |

|     2 |

|     3 |

|     4 |

+-------+

4 rows in set (0.00 sec)

 

Si en este momento ejecutamos un ROLLBACK, la transacción no será completada, y los cambios realizados sobre la tabla no tendrán efecto.

 

mysql> ROLLBACK;

Query OK, 0 rows affected (0.06 sec)

mysql> SELECT * FROM innotest;

 

+-------+

| campo |

+-------+

|     1 |

|     2 |

|     3 |

+-------+

3 rows in set (0.00 sec)

 

 

Si queremos que la transacción se lleve a cabo pondremos COMMIT

Ejemplo:

 

mysql> CREATE TABLE t (name CHAR(20), UNIQUE (name)) TYPE = INNODB;

 

mysql> BEGIN;

 

mysql> INSERT INTO t SET name = 'William';

 

mysql> INSERT INTO t SET name = 'Wallace';

 

mysql> COMMIT; mysql> SELECT * FROM t;

 

 

+---------+

| name    |

+---------+

| Wallace |

| William |

+---------+

 

 

mysql> BEGIN;

 

mysql> INSERT INTO t SET name = 'Gromit';

 

mysql> INSERT INTO t SET name = 'Wallace';

 

ERROR 1062: Duplicate entry 'Wallace' for key 1

 

mysql> ROLLBACK;

 

mysql> SELECT * FROM t;


+---------+

| name    |

+---------+

| Wallace |

| William |

+---------+

 

 

//que es auto commit y porke lo iguala a 0

 

mysql> DROP TABLE t;

 

mysql> CREATE TABLE t (name CHAR(20), UNIQUE (name)) TYPE = INNODB;

 

mysql> SET AUTOCOMMIT = 0;

 

mysql> INSERT INTO t SET name = 'William';

 

mysql> INSERT INTO t SET name = 'Wallace';

 

mysql> COMMIT;

 

mysql> SELECT * FROM t;


+---------+

| name    |

+---------+

| Wallace |

| William |

+---------+


 

 

//////////////////////////////////////

                ORACLE transaccion

CREATE TABLE `departamentos` (
`CODIGO` INTEGER(11) NOT NULL DEFAULT ’0′,
`NOMBRE` VARCHAR(100),
`PRESUPUESTO` INTEGER(11) DEFAULT NULL,
PRIMARY KEY (`CODIGO`)
)ENGINE=InnoDB


Ahora, insertaremos registros de la tabla departamentos_externos a departamentos mediante una transacción:

START TRANSACTION;
SELECT @A := presupuesto
FROM departamentos_externos
WHERE codigo =11;
INSERT INTO departamentos( codigo, nombre, presupuesto )
VALUES ( 11, ‘Department test’, @A );
COMMIT;


En el ejemplo anterior se guardo el presupuesto del departamento externo 11 en la variable @A y luego fue asignado al presupuesto en la tabla departamentos.

 

///////////////////

Commit en oracle

insert into emp (empno,ename,sal) values (101,’Abid’,2300);

commit;

insert into emp (empno,ename,sal) values (109,’Sami’,3000);

savepoint a;

insert into dept values (10,’Sales’,’Hyd’);

savepoint b;

insert into salgrade values (‘III’,9000,12000);

 

rollback to a;

 

rollback to b;


rollback;

 


commit;

 

 

No hay comentarios:

Publicar un comentario