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.
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
`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;
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