Está en la página 1de 5

Transacciones

En MySql verificamos el soporte para tablas InnoDB (las cuales soportan transacciones) a través de:

Mysql > SHOW VARIABLES LIKE '%innodb%';

El inicio de una transaccion se marca con BEGIN

Mysql > begin;

O también

Mysql > start transaction;

Y lo terminaremos con un COMMIT o un ROLLBACK, a esto lo llamaremos una transaccion


EXPLICITA

Tambien podemos usar SET AUTOCOMMIT=0;

El cual deshabilita el commit automatico del mysql y los cambios que


hagamos no se reflejaran definitivamente hasta que no hagamos un COMMIT
o ROLLBACK, a esto lo conocemos como una transacción implícita.

Ejemplo:

mysql > start transaction;

mysql > update notas set parcial=parcial+1 where codigo=1002;

mysql > commit

Variables de usuario

Usando @
set @x := 1;

set @y = @x + 2;

select @w := 5;

select @y;

En este ultimo ejemplo @aa toma el ultimo valor

Usando DECLARE

Para declarar variables locales en procedimientos almacenados

declare exepcion varchar(250);

declare existeLicencia int;

declare fin int default 0;

declare valor decimal(18,2);

Ejemplo:

mysql > start transaction;


mysql > select @pf := (parcial+final)/2 from alumnos where codigo=1001;

mysql > update record_academico set promedio_final = @pf where codigo=1001;

mysql > commit

Lecturas 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.

TRIGGERS

Un Trigger es un objeto de la BD que se asocia a una tabla y se activa automáticamente cuando


ocurre un evento en particular para la tabla.

CREATE TRIGGER <nombre> {BEFORE│AFTER} {INSERT │UPDATE│ DELETE}


ON <table>
FOR EACH ROW
BEGIN
<Sentencias SQL>
END;

Ejm.

La tabla correspondiente queda bloqueada mientras se realiza la operación.

Este ejm. No funcionara

create trigger promedio after insert on alumnos


for each ROW
update alumnos set promedio=(parcial+final)/2
Por lo que habría que utilizar

create trigger adicion before insert on alumnos

for each row

begin

set new.promedio = (new.parcial+new.final)/2;

end

Entonces al insertar:

Insert into alumnos(código, parcial, final) values (“120001”,12,14)

El trigger hara que también se actualize el promedio final en esa misma tabla

Tambien podría ser el siguiente ejemplo:

create trigger adicion before insert on alumnos


for each row
begin
set @x = (new.parcial+new.final)/2;
end

y en el insert tendriamos

Insert into alumnos(código, parcial, final,promedio) values (“120001”,12,14,@x)

En general tenemos:

En INSERT se puede usar valor NEW

En DELETE se puede usar valor OLD

En UPDATE se pueden usar valores NEW y OLD

Ejemplos:

CREATE TRIGGER inserta_auditoria_clientes AFTER INSERT ON clientes


FOR EACH ROW
INSERT INTO auditoria_clientes(nombre_nuevo, seccion_nueva, usuario, modificado,
proceso, Id_Cliente)
VALUES (NEW.nombre, NEW.seccion, CURRENT_USER(), NOW, NEW.Accion, NEW.id_cliente);

CREATE TRIGGER Modifica_auditoria_clientes BEFORE UPDATE ON clientes


FOR EACH ROW
INSERT INTO auditoria_clientes(nombre_anterior, seccion_anterior, nombre_nuevo,
seccion_nueva, usuario, modificado, Id_Cliente)
VALUES (OLD.nombre, OLD.seccion, NEW.nombre, NEW.seccion, CURRENT_USER(), NOW(),
NEW.id_cliente);

CREATE TRIGGER Elimina_auditoria_clientes AFTER DELETE ON clientes


FOR EACH ROW
INSERT INTO auditoria_clientes(nombre_anterior, seccion_anterior, usuario, modificado,
Id_cliente)
VALUES (OLD.nombre, OLD.seccion, CURRENT_USER(), NOW(), OLD.id_cliente);

También podría gustarte