Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Posso usar a capacidade de transação no gatilho MySQL


Sim, você pode, mas como você faz isso depende da sua versão.

Em primeiro lugar, os próprios gatilhos são transacionais; na sua situação, você tem um gatilho de inserção que executa mais duas inserções. Se um deles falhar, você obterá o efeito desejado.

Considere o seguinte exemplo:
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 ;

Agora, quando executo uma inserção que falha, isso acontece:
mysql> INSERT INTO a VALUES (5);
ERROR 1054 (42S22): Unknown column 'banana' in 'field list'
mysql> SELECT * FROM a;
Empty set (0.00 sec)

Isso corresponde ao resultado desejado.

De maneira mais geral, se você tiver uma lógica que possa usar para validar seus dados antes de tentar a inserção, poderá falhar o gatilho de diferentes maneiras:
  • No MySQL 5.5, você pode usar o SINAL mecanismo para gerar um erro do seu gatilho, fazendo com que ele falhe em toda a inserção.
  • Antes do MySQL 5.5, você pode gerar um erro deliberado para falhar o gatilho.

Suponho que você esteja usando 5.0 do link em sua pergunta, portanto, se precisar, você pode executar um erro deliberado, por exemplo, inserir deliberadamente em uma coluna inválida, para falhar em um gatilho. No entanto, a situação que você descreve em sua pergunta já é tratada transacionalmente, conforme descrito no início da minha resposta.