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

Os gatilhos de banco de dados são seguros para restrições de integridade entre tabelas?


A resposta é gatilhos não são seguros .

Acontece que o gatilho realmente não vê alterações não confirmadas feitas em outras transações e passa sem erro. Pode ser demonstrado assim

Transação 1:
START TRANSACTION;
INSERT INTO plays_in (BetID, PlayerID) VALUES (1,1); -- query A

Transação 2:
START TRANSACTION;
INSERT INTO plays_in (BetID, PlayerID) VALUES (1,2); -- query B; in conflict with A, but passses

Ambas as transações:
COMMIT;

Agora plays_in will contém ambos os registros inseridos mesmo que se A e B fossem executados em uma única transação, o gatilho lançaria um erro.

Todas as fontes de exemplo podem ser obtidas aqui