我很快浏览了MySQL手册,但没有找到有关我的问题的确切信息.这是我的问题:如果我有一个InnoDB表A,其中有两个触发器由’AFTER INSERT ON A’和’AFTER UPDATE ON A’触发.更具体地说,例如:一个触发器定义为:
CREATE TRIGGER test_trigger AFTER INSERT ON A
FOR EACH ROW
BEGIN
INSERT INTO B SELECT * FROM A WHERE A.col1 = NEW.col1
END;
你可以忽略BEGIN和END之间的查询,基本上我的意思是这个触发器会在表B中插入几行,这也是一个InnoDB表.
现在,如果我启动一个事务,然后在表A中插入许多行,比如:10K行,如果没有与表A关联的触发器,那么所有这些插入都是原子的,这是肯定的.现在,如果表A与几个插入/更新触发器相关联,这些触发器将许多行插入/更新到表B和/或表C等,那么所有这些插入和/或更新是否仍然是原子的?
我认为它仍然是原子的,但它很难测试,我在手册中找不到任何解释.有谁可以证实这一点?
解决方法:
而通过原子,你的意思是如果触发器中的一个语句失败,整个语句就会失败.是 – 触发器在语句的事务上下文中完成.当然,如果没有交易,则没有交易上下文.
For transactional tables, failure of a statement should cause rollback of all changes performed by the statement. Failure of a trigger causes the statement to fail, so trigger failure also causes rollback. For nontransactional tables, such rollback cannot be done, so although the statement fails, any changes performed prior to the point of the error remain in effect.
并且您不能在触发器中启动事务.