mysql如何一起触发和回滚?我想知道这是怎么回事?如果我继续处理多个sql语句,因为它在同一个查询中,所以可以回滚,但是对于触发器,它似乎不同,因为它是单独进行的。
如果我的sql语句失败并引发错误,那么触发器还在继续吗?如果有,我怎么才能阻止扳机?
如果我的sql语句成功,引发触发器并出错,我如何知道并回滚?
谢谢
发布于 2017-03-30 01:30:46
举个例子..。
案例1:
SET autocommit=ON;
INSERT ...; -- with or without triggers
UPDATE ...; -- with or without triggersINSERT及其触发操作是以原子方式执行的。也就是说,INSERT和触发器要么完全完成,要么完全取消。
UPDATE及其触发操作是以原子方式执行的。也就是说,UPDATE和触发器要么完全完成,要么完全取消。
案例2:
-- (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:(不要使用这种情况;它太容易出现用户错误)。
SET autocommit = OFF;
INSERT ...; -- with or without triggers
UPDATE ...; -- with or without triggers
if ... then ROLLBACK else COMMIT;这与案例2的工作原理相同,只是关于ROLLBACK/COMMIT的范围存在一些问题。
(如果答案不正确,请编辑。)
发布于 2017-03-26 11:32:35
在发生错误时发生的情况将在文档中描述:
MySQL处理触发器执行过程中的错误如下:
因此,假设您使用的是InnoDB,语句和触发器(以及触发器本身所做的更改可能调用的任何触发器)都是原子的。如果其中一个失败了,另一个也会失败并被回滚。这不需要显式的事务。
如果您使用的是例如MyISAM (它不支持事务),并且发生故障,那么上面列表中的任何一个步骤所做的更改都不能回滚。如果InnoDB表上的触发器将一行插入到MyISAM表中,也会发生这种情况。如果在以后的任何步骤中发生故障,则只有对涉及的InnoDB表的更改才会回滚。
https://dba.stackexchange.com/questions/168191
复制相似问题