1. Comit Rollback y Trigers
Presentado por:
Ricardo Arturo Torres
Juan Jacobo Tibaquira
Alejandro Vinasco Ardila
2. Commit y Rollback
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.
3. Ejemplos:
START TRANSACTION:
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT
Con START TRANSACTION, autocommit permanece
deshabilitado hasta el final de la transacción con COMMIT o
ROLLBACK. El modo autocommit vuelve a su estado prévio.
4. START TRANSACTION WITH CONSISTENT
SNAPSHOT;
La cláusula WITH CONSISTENT SNAPSHOT
comienza una lectura consistente para
motores de almacenamiento capaces de ello.
Actualmente, esto se aplica sólo a InnoDB. El
efecto es el mismo que realizar un START
TRANSACTION seguido por un SELECT
desde cualquier tabla InnoDB.
Comenzar una transacción provoca que se
realice un UNLOCK TABLES implícito.
5. Tenga en cuenta que si no usa tablas
transaccionales, cualquier cambio se almacena
de golpe, a pesar del estado del modo
autocommit.
Si realiza un comando ROLLBACK tras actualizar
una tabla no transaccional dentro de una
transacción, ocurre una advertencia
ER_WARNING_NOT_COMPLETE_ROLLBAC
K.
Los cambios en tablas transaccionales se
deshacen, pero no los cambios en tablas no
transaccionales.
6. Cada transacción se almacena en el log binario en un
trozo, hasta COMMIT. Las transacciones que se
deshacen no se loguean. (Exceción: Las modificaciones
a tablas no transaccionales no pueden deshacerse. Si
una transacción que se deshace incluye modificaciones
a tablas no transaccionales, la transacción entera se
loguea con un comando ROLLBACK al final para
asegurar que las modificaciones a estas tablas se
replican.) “El registro binario (Binary Log)”.
Puede cambiar el nivel de aislamiento para transacciones
con SET TRANSACTION ISOLATION LEVEL.
7. “Sintaxis de SET TRANSACTION”.
Deshacer puede ser una operación lenta que puede ocurrir sin
que el usuario lo haya pedido explícitamente (por ejemplo,
cuando ocurre un error). Debido a ello, SHOW
PROCESSLIST en MySQL 5.0 muestra Rolling back en la
columna Statepara la conexión durante rollbacks implícitos y
explícitos (comando SQL ROLLBACK).
Ésta es una traducción del manual de referencia de MySQL,
que puede encontrarse en dev.mysql.com
8. Procedimiento de almacenado
Son funcionalidades nuevas apertir de la
version 5.0 de MySQL
Es un conjunto de comandos SQL que pueden
almacenarse en el servidor.
Los clientes ya no necesitan relanzar los
comandos individuales.
9. Procesos de almacenado
Se usan cuando multiples aplicaciones cliente
funcionan en distintas plataformas, o estan
escritas en distintos lenguajes.
Cuando la seguridad es muy importante.
10. Procesos de almacenado
Los procesos de almacenados pueden enviar
menos informacion entre el servidor y el cliente.
11. Triggers o Disparadores
Otra de las nuevas características incluidas en
MySQL, además de los procedimientos
almacenados, son los triggers, son escuchas,
que se mantienen alerta a los eventos que
puedan producirse en una tabla (insert , update
y delete) y ejecutan un código antes (before) o
después (after) de que se produzca este
evento.
12. Sintaxis de los triggers
CREATE TRIGGER <nombre>
{BEFORE|AFTER}
{INSERT|UPDATE|DELETE}
ON
<tablename>
FOR EACH ROW
BEGIN
<sentenciasSQL>
END;
13. Ejemplo
Crearemos la tabla de clientes y le ponemos
algunos registros:
CREATE TABLE clientes(
id int not null auto_increment,
nombre varchar(100),
seccion varchar(10),
PRIMARY KEY(id),
KEY(nombre)
) ENGINE = InnoDB;
15. Y una tabla que será la que guardará los datos
de la "auditoria"
CREATE TABLE auditoria_clientes
(
id int not null auto_increment,
nombre varchar(100),
anterior_seccion varchar(10),
usuario varchar(40),
modificado datetime,
primary key(id)
) ENGINE = InnoDB;
16. y finalmente un trigger que se disparará cada
vez que alguien modifique un dato de la tabla
clientes y lo guardará en una tabla junto al
nombre del usuario y la fecha.
CREATE TRIGGER trigger_auditoria_clientes
AFTER UPDATE ON clientes
FOR EACH ROW
INSERT INTO auditoria_clientes(name,
anterior_seccion, usuario, modificado )
VALUES (OLD.nombre, OLD.seccion,
CURRENT_USER(), NOW() );