La risposta è i trigger non sono sicuri .
Si scopre che il trigger in realtà non vede le modifiche non vincolate eseguite in altre transazioni e passa senza errori. Può essere dimostrato in questo modo
Transazione 1:
START TRANSACTION;
INSERT INTO plays_in (BetID, PlayerID) VALUES (1,1); -- query A
Transazione 2:
START TRANSACTION;
INSERT INTO plays_in (BetID, PlayerID) VALUES (1,2); -- query B; in conflict with A, but passses
Entrambe le transazioni:
COMMIT;
Ora plays_in
will contiene entrambi i record inseriti anche se A e B sono stati eseguiti in una singola transazione, il trigger genererebbe un errore.
L'intera fonte di esempio può essere consultata qui