MySQL事务和触发器
我很快浏览了MySQL手册,但没有找到有关我的问题的确切信息。这里是我的问题:如果我有一个InnoDB表A,其中两个触发器由'AFTER INSERT ON A'和'AFTER UPDATE ON A'触发。更具体地讲,例如:一个触发器定义为:MySQL事务和触发器
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等插入/更新许多行,所有这些插入和/或更新是否仍然是原子的?
我认为它仍然是原子的,但它有点难以测试,我在手册中找不到任何解释。任何人都可以确认吗?
与原子,你的意思是,如果在触发一个语句失败,整个语句失败。是的 - 触发器是在语句事务的上下文中完成的。当然,如果没有交易,那么就没有交易背景。
对于事务性表,语句失败应该导致回滚语句执行的所有更改。触发失败会导致语句失败,因此触发失败也会导致回滚。对于非事务性表,这种回滚无法完成,因此虽然语句失败,但在错误点之前执行的任何更改仍然有效。
而且您不允许在触发器中启动事务。
感谢提示,不能在触发器中开始/结束事务。 +1 – 2016-02-11 05:48:09
是的肯定在DB/2 ... – 2010-04-14 03:59:57
你能指出它在手册中提到的地方吗? – WilliamLou 2010-04-14 17:51:21
可能重复的[是触发器事务吗?](http://*.com/questions/37749288/are-triggers-transaction) – Sandeep 2016-06-11 11:46:08