2010-04-14 5 views
8

J'ai rapidement parcouru le manuel MySQL mais je n'ai pas trouvé l'information exacte sur ma question. Voici ma question: si j'ai une table InnoDB A avec deux déclencheurs déclenchés par 'AFTER INSERT ON A' et 'AFTER UPDATE ON A'. Plus précisément, par exemple: un déclencheur est défini comme:transaction MySQL et déclencher

CREATE TRIGGER test_trigger AFTER INSERT ON A 
     FOR EACH ROW 
         BEGIN 
         INSERT INTO B SELECT * FROM A WHERE A.col1 = NEW.col1 
         END; 

Vous pouvez ignorer la requête entre BEGIN ET END, essentiellement je veux dire ce déclencheur va insérer plusieurs lignes dans le tableau B qui est aussi une table InnoDB. Maintenant, si j'ai commencé une transaction et que j'insère plusieurs lignes, disons: 10K lignes, dans le tableau A. S'il n'y a pas de déclencheur associé à la table A, tous ces insertions sont atomiques, c'est certain. Maintenant, si la table A est associée à plusieurs déclencheurs d'insertion/mise à jour qui insèrent/mettent à jour de nombreuses lignes à la table B et/ou à la table C etc., ces insertions et/ou mises à jour seront-elles toutes atomiques?

Je pense que c'est encore atomique, mais c'est un peu difficile à tester et je ne trouve aucune explication dans le manuel. Tout le monde peut le confirmer?

+0

Oui pour sûr Dans DB/2 ... –

+0

pourriez-vous indiquer où il est mentionné dans le manuel? – WilliamLou

+0

Possible duplicata de [Are triggers transaction?] (Http://stackoverflow.com/questions/37749288/are-triggers-transaction) – Sandeep

Répondre

5

Et atomique, vous voulez dire si une instruction dans le déclencheur échoue, échoue toute la déclaration. Oui - le déclencheur est effectué dans le contexte de la transaction de déclaration. Et non, bien sûr, s'il n'y a pas de transaction, il n'y a pas de contexte de transaction.

Pour les tables transactionnelles, l'échec d'une instruction doit provoquer l'annulation de toutes les modifications effectuées par l'instruction. L'échec d'un déclencheur entraîne l'échec de l'instruction, l'échec du trigger entraîne également une annulation. Pour les tables non transactionnelles, une telle restauration ne peut pas être effectuée. Ainsi, bien que l'instruction échoue, les modifications effectuées avant le point d'erreur restent actives.

Et vous n'êtes pas autorisé à démarrer une transaction dans le déclencheur.

+0

Merci pour le conseil que l'on ne peut pas commencer/terminer la transaction dans le trigger. +1 –

Questions connexes