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; 

可以忽略BEGINEND之间的查询,基本上我的意思是这个触发器将插入几行到表B中这也是一个InnoDB表。

现在,如果我启动了一个事务,然后在表A中插入许多行,例如:10K行,如果没有与表A关联的触发器,所有这些插入操作都是原子操作,这是肯定的。现在,如果表A与多个插入/更新触发器相关联,这些触发器向表B和/或表C等插入/更新许多行,所有这些插入和/或更新是否仍然是原子的?

我认为它仍然是原子的,但它有点难以测试,我在手册中找不到任何解释。任何人都可以确认吗?

+0

是的肯定在DB/2 ... – 2010-04-14 03:59:57

+0

你能指出它在手册中提到的地方吗? – WilliamLou 2010-04-14 17:51:21

+0

可能重复的[是触发器事务吗?](http://*.com/questions/37749288/are-triggers-transaction) – Sandeep 2016-06-11 11:46:08

它们应该是原子的,如果在事务中完成的话。触发器上的MySQL页面具有适当的信息。

http://dev.mysql.com/doc/refman/5.0/en/triggers.html

与原子,你的意思是,如果在触发一个语句失败,整个语句失败。是的 - 触发器是在语句事务的上下文中完成的。当然,如果没有交易,那么就没有交易背景。

对于事务性表,语句失败应该导致回滚语句执行的所有更改。触发失败会导致语句失败,因此触发失败也会导致回滚。对于非事务性表,这种回滚无法完成,因此虽然语句失败,但在错误点之前执行的任何更改仍然有效。

而且您不允许在触发器中启动事务。

+0

感谢提示,不能在触发器中开始/结束事务。 +1 – 2016-02-11 05:48:09