Odpowiedź brzmi:wyzwalacze nie są bezpieczne .
Okazuje się, że wyzwalacz tak naprawdę nie widzi niezatwierdzonych zmian dokonanych w innych transakcjach i przechodzi bez błędu. Można to zademonstrować w ten sposób
Transakcja 1:
START TRANSACTION;
INSERT INTO plays_in (BetID, PlayerID) VALUES (1,1); -- query A
Transakcja 2:
START TRANSACTION;
INSERT INTO plays_in (BetID, PlayerID) VALUES (1,2); -- query B; in conflict with A, but passses
Obie transakcje:
COMMIT;
Teraz plays_in
will zawiera oba wstawione rekordy, nawet jeśli A i B zostały wykonane w jednej transakcji, wyzwalacz wygeneruje błąd.
Całe przykładowe źródła można znaleźć tutaj