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

all*_*nos 9 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;
Run Code Online (Sandbox Code Playgroud)

预期结果:表格test为空

实际结果:table test包含一个值为5的记录

Mar*_*rkR 8

如果插入因重复而失败,则数据库将事务回滚到该语句的开头.

它使用在语句开头创建的内部保存点,然后回滚到该保存点.

它不会回滚整个事务,因为这可能不是您想要的.

可以使用命令行参数配置mysql客户端的行为.它可以退出(可以隐式回滚)或继续.

如果您使用自己的应用程序,它的作用取决于您.


Mysql不会对你如何处理失败施加POLICY - 它会将其留给你的应用程序.所以你对他们所做的就是你自己的事业 - 如果你愿意,你可以忽略它们.

  • 我想给你100个代表点,因为"Mysql不会对你如何处理失败施加政策 - 它会让你的申请失败.所以你对他们所做的就是你自己的事情 - 如果你愿意,你可以忽略它们." (2认同)

小智 3

如果发生错误,MySql(和其他 SQL 引擎 AFAIK)不会自动回滚事务。

您必须声明一个错误处理程序来回滚事务:

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND
BEGIN 
  ROLLBACK; 
  CALL ERROR_ROLLBACK_OCCURRED; 
END;
Run Code Online (Sandbox Code Playgroud)