sql >> Base de Datos >  >> RDS >> Mysql

¿Puedo usar la capacidad de transacción en el disparador de MySQL?

Sí puedes, pero cómo lo haces depende de tu versión.

En primer lugar, los disparadores son en sí mismos transaccionales; en su situación, tiene un disparador de inserción que realiza dos inserciones más. Si uno de esos falla, obtendrá el efecto deseado.

Considere el siguiente ejemplo:

CREATE TABLE a (colA INT);
CREATE TABLE b (colB INT);
CREATE TABLE c (colC INT);
delimiter :
CREATE TRIGGER testtrig BEFORE INSERT ON a
  FOR EACH ROW BEGIN
    INSERT INTO b(colB) VALUES(NEW.colA);
    INSERT INTO c(banana) VALUES (NEW.colA); -- note the faulty column name
END;:
delimiter ;

Ahora, cuando ejecuto una inserción que falla, sucede lo siguiente:

mysql> INSERT INTO a VALUES (5);
ERROR 1054 (42S22): Unknown column 'banana' in 'field list'
mysql> SELECT * FROM a;
Empty set (0.00 sec)

Esto coincide con el resultado deseado.

De manera más general, si tiene una lógica que puede usar para validar sus datos antes de intentar la inserción, puede fallar el disparador de diferentes maneras:

  • En MySQL 5.5, puede usar SIGNAL mecanismo para generar un error desde su disparador, lo que hace que falle toda la inserción.
  • Antes de MySQL 5.5, puede generar un error deliberado para fallar el disparador.

Supongo que está usando 5.0 desde el enlace en su pregunta, por lo que si lo necesita, puede realizar un error deliberado, por ejemplo, insertar deliberadamente en una columna no válida, para fallar un desencadenador. Sin embargo, la situación que describe en su pregunta ya se maneja transaccionalmente, como se describe al comienzo de mi respuesta.