答えはトリガーは安全ではありませんです 。
トリガーは、他のトランザクションで行われたコミットされていない変更を実際には認識せず、エラーなしで渡されます。このように示すことができます
トランザクション1:
START TRANSACTION;
INSERT INTO plays_in (BetID, PlayerID) VALUES (1,1); -- query A
トランザクション2:
START TRANSACTION;
INSERT INTO plays_in (BetID, PlayerID) VALUES (1,2); -- query B; in conflict with A, but passses
両方のトランザクション:
COMMIT;
今plays_in
AとBが単一のトランザクションで実行された場合でも、挿入された両方のレコードが含まれます。トリガーはエラーをスローします。
ソースの例全体は、ここ で確認できます。