我很快浏览了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等,那么所有这些插入和/或更新是否仍然是原子的?
我认为它仍然是原子的,但它很难测试,我在手册中找不到任何解释。任何人都可以证实这一点吗?
答案 0 :(得分:6)
原则上,你的意思是如果触发器中的一个语句失败,整个语句就会失败。是 - 触发器在语句的事务上下文中完成。当然,如果没有交易,则没有交易上下文。
对于事务表,语句失败应导致回滚语句执行的所有更改。触发器失败会导致语句失败,因此触发器失败也会导致回滚。对于非事务性表,无法进行此类回滚,因此尽管语句失败,但在错误点之前执行的任何更改仍然有效。
并且您不能在触发器中启动交易。
答案 1 :(得分:3)
如果在交易中完成,它们应该是原子的。触发器上的MySQL页面具有适当的信息。