在mysql innodb事务中,我希望重复键错误导致回滚。它没有,而是简单地抛出错误并继续下一个命令。一旦达到COMMIT命令,将提交事务,没有重复的密钥导致命令。
这是预期的行为吗?如果是这样,那么如何进行设置以便在发生此类错误时回滚事务而不是提交事务?
测试环境:
CREATE TABLE `test` (
`id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
BEGIN;
INSERT INTO test VALUES (5);
INSERT INTO test VALUES (5);
COMMIT;
预期结果:表test
为空
实际结果:表test
包含一个值为5的记录
答案 0 :(得分:8)
如果插入因重复而失败,则数据库将事务回滚到该语句的开头。
它使用在语句开头创建的内部保存点,然后回滚到该保存点。
它不会回滚整个交易,因为这可能不是您想要的。
可以使用命令行参数配置mysql客户端的行为。它可以退出(可以隐式回滚)或继续。
如果您使用的是自己的应用,那么它的功能取决于您。
Mysql没有对你如何处理失败施加POLICY - 它将由你的应用程序决定。所以你对他们所做的就是你自己的事业 - 如果你愿意,你可以忽略它们。
答案 1 :(得分:3)
如果发生错误,MySql(和其他sql引擎AFAIK)不会自动回滚事务。
您必须声明一个将回滚事务的错误处理程序:
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND
BEGIN
ROLLBACK;
CALL ERROR_ROLLBACK_OCCURRED;
END;