我快速浏览了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中插入几行,该表B也是InnoDB表。现在,如果我开始一个事务,然后将许多行(例如:10K行)插入表A。如果没有与表A关联的触发器,则所有这些插入都是原子的,这是肯定的。现在,如果表A与几个插入/更新触发器相关联,这些触发器将许多行插入/更新到表B和/或表C等。是否所有这些插入和/或更新仍然都是原子的?
我认为它仍然是原子的,但是有点难以测试,我在《手册》中找不到任何解释。任何人都可以确认吗?
最佳答案
从原子上说,您的意思是,如果触发器中的一条语句失败,则整个语句都会失败。是的-触发器是在语句的事务上下文中完成的。当然,如果没有事务,那么就没有事务上下文。
并且不允许您在触发器中启动事务。
关于MySQL事务和触发器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2634787/