首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql回滚和触发器

问Mysql回滚和触发器
EN

Database Administration用户
提问于 2017-03-26 08:03:27
回答 2查看 8.9K关注 0票数 1

mysql如何一起触发和回滚?我想知道这是怎么回事?如果我继续处理多个sql语句,因为它在同一个查询中,所以可以回滚,但是对于触发器,它似乎不同,因为它是单独进行的。

如果我的sql语句失败并引发错误,那么触发器还在继续吗?如果有,我怎么才能阻止扳机?

如果我的sql语句成功,引发触发器并出错,我如何知道并回滚?

谢谢

EN

回答 2

Database Administration用户

回答已采纳

发布于 2017-03-30 01:30:46

举个例子..。

案例1:

代码语言:javascript
复制
  SET autocommit=ON;
  INSERT ...; -- with or without triggers
  UPDATE ...; -- with or without triggers

INSERT及其触发操作是以原子方式执行的。也就是说,INSERT和触发器要么完全完成,要么完全取消。

UPDATE及其触发操作是以原子方式执行的。也就是说,UPDATE和触发器要么完全完成,要么完全取消。

案例2:

代码语言:javascript
复制
  -- (the value of `autocommit` does not matter)
  START TRANSACTION;
  INSERT ...; -- with or without triggers
  UPDATE ...; -- with or without triggers
  if ... then ROLLBACK else COMMIT;

INSERT (及其触发器操作)可能成功或可能失败并回滚。

UPDATE (及其触发器操作)可能成功或可能失败并回滚。

您可以选择ROLLBACK --在本例中,上述所有内容都将取消。

您可以选择COMMIT --在本例中,所有尚未回滚的内容都将提交。

案例3:(不要使用这种情况;它太容易出现用户错误)。

代码语言:javascript
复制
  SET autocommit = OFF;
  INSERT ...; -- with or without triggers
  UPDATE ...; -- with or without triggers
  if ... then ROLLBACK else COMMIT;

这与案例2的工作原理相同,只是关于ROLLBACK/COMMIT的范围存在一些问题。

(如果答案不正确,请编辑。)

票数 2
EN

Database Administration用户

发布于 2017-03-26 11:32:35

在发生错误时发生的情况将在文档中描述:

MySQL处理触发器执行过程中的错误如下:

  • 如果前置触发器失败,则不执行相应行的操作。
  • 插入或修改行的尝试会激活“前触发器”,而不管该尝试随后是否成功。
  • 只有在触发之前有任何触发器且行操作成功执行的情况下,才执行“后触发器”。
  • 触发之前或之后的错误会导致导致触发器调用的整个语句失败。
  • 对于事务性表,语句的失败应导致语句执行的所有更改回滚。触发器的失败会导致语句失败,因此触发器失败也会导致回滚。对于非事务性表,无法执行这种回滚操作,因此尽管语句失败,但在错误点之前执行的任何更改仍然有效。

因此,假设您使用的是InnoDB,语句和触发器(以及触发器本身所做的更改可能调用的任何触发器)都是原子的。如果其中一个失败了,另一个也会失败并被回滚。这不需要显式的事务。

如果您使用的是例如MyISAM (它不支持事务),并且发生故障,那么上面列表中的任何一个步骤所做的更改都不能回滚。如果InnoDB表上的触发器将一行插入到MyISAM表中,也会发生这种情况。如果在以后的任何步骤中发生故障,则只有对涉及的InnoDB表的更改才会回滚。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/168191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档