10

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

4

2 回答 2

9

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

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

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

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

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


Mysql 不会将 POLICY 强加于您如何处理故障 - 它由您的应用程序决定。所以你对它们做什么是你自己的事——如果你愿意,你可以忽略它们。

于 2009-10-27T13:15:52.597 回答
3

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

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

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND
BEGIN 
  ROLLBACK; 
  CALL ERROR_ROLLBACK_OCCURRED; 
END;
于 2010-07-22T17:44:14.937 回答