重复键错误不会取消/回滚mysql事务

时间:2009-10-27 12:11:31

标签: mysql transactions rollback

在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的记录

2 个答案:

答案 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;