2010-04-14 19 views
8

Busqué rápidamente el manual de MySQL pero no encontré la información exacta sobre mi pregunta. Aquí está mi pregunta: si tengo una tabla InnoDB A con dos activadores activados por 'DESPUÉS DE INSERTAR EN A' y 'DESPUÉS ACTUALIZAR EN A'. Más específicamente, por ejemplo: un activador se define como:Transacción MySQL y gatillo

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

Puede pasar por alto la consulta entre BEGIN Y END, básicamente me refiero a este disparador insertará varias filas en la tabla B que es también una tabla InnoDB.

Ahora, si comencé una transacción y luego inserté muchas filas, digamos: 10K filas, en la tabla A. Si no hay un disparador asociado con la tabla A, todas estas inserciones son atómicas, eso es seguro. Ahora, si la tabla A está asociada con varios disparadores de inserción/actualización que insertan/actualizan muchas filas en la tabla B y/o la tabla C, etc., ¿todos estos insertos y/o actualizaciones seguirán siendo todos atómicos?

Creo que sigue siendo atómico, pero es un poco difícil de probar y no encuentro explicaciones en el Manual. ¿Alguien puede confirmar esto?

+0

Sí seguro En DB/2 ... –

+0

¿podría indicar dónde se menciona en el manual? – WilliamLou

+0

Posible duplicado de [¿Son activadas las transacciones?] (Http://stackoverflow.com/questions/37749288/are-triggers-transaction) – Sandeep

Respuesta

5

Y por atómica, es decir, si una instrucción en el gatillo falla, todo el comando falla. Sí, el desencadenante se realiza en el contexto de la transacción de extracto. Y no, por supuesto, si no hay transacción, entonces no hay contexto de transacción.

Para las tablas transaccionales, el error de una instrucción debe provocar la reversión de todos los cambios realizados por la instrucción. La falla de un desencadenante hace que la instrucción falle, por lo que la falla del desencadenador también causa la restitución. Para tablas no transaccionales, dicha reversión no se puede realizar, por lo tanto, aunque la instrucción falle, cualquier cambio realizado antes del punto del error permanecerá vigente.

Y no puede iniciar una transacción en el desencadenador.

+0

Gracias por la sugerencia de que no se puede iniciar/finalizar la transacción en el desencadenador. +1 –

Cuestiones relacionadas