首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重复键错误不能取消/回滚mysql事务

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

Stack Overflow用户
提问于 2009-10-27 20:11:31
回答 2查看 3.9K关注 0票数 10

在mysql innodb事务中,我预计重复键错误会导致回滚。它不会这样做,相反,它只是抛出一个错误,然后继续执行下一个命令。一旦到达COMMIT命令,事务将被提交,sans重复键导致命令。

这是预期的行为吗?如果是这样,如何设置它,以便在发生此类错误时回滚事务而不是提交事务?

测试环境:

代码语言:javascript
复制
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的记录

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-23 01:44:15

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

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

代码语言:javascript
复制
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND
BEGIN 
  ROLLBACK; 
  CALL ERROR_ROLLBACK_OCCURRED; 
END;
票数 3
EN

Stack Overflow用户

发布于 2009-10-27 21:15:53

如果由于重复而导致insert失败,则数据库将事务回滚到该语句的开头。

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

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

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

如果你使用的是你自己的应用程序,它会做什么取决于你。

Mysql不会对您如何处理故障强加策略-它将其留给您的应用程序。因此,你如何处理它们是你自己的事情--如果你愿意,你可以忽略它们。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1630400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档