是在会话终止(事务回滚)后更新触发器被终止后?
问题描述:
我们有这个真正不想要的更新查询到我们的表A.并且这个表包含更新表B,C的更新后触发器。我们杀掉了表A中Update语句的主要事务,问题是否也回滚了表B和C中的更改?或者更新触发器甚至被调用?因为我们在整个执行结束前杀死了会话。提前致谢。是在会话终止(事务回滚)后更新触发器被终止后?
答
如果...
- 你是在一个事务中,和
- 所有访问的表是事务表(如使用的是InnoDB,不使用如的MyISAM或MEMORY)
...然后回滚(包括从会话中终止的隐式回滚)回滚全部在事务中进行的更改(包括触发器所做的更改)以及级联外键操作。
触发器(和级联)在MySQL中从不推迟,因此当行正在更新时它们会触发FOR EACH ROW
,但这当然只是学术的,因为它们所做的所有更改都将随着回滚而撤消。
如果表A是完整的,那么表B和C也应该是完整的。当然,最安全的方法是取出最近的备份,并将当前的数据填充与您在备份中找到的数据进行比较,作为一般性的完整性检查。当然,这需要频繁的快照备份。