在mysql innodb事务中,我预计重复键错误会导致回滚。它不会这样做,相反,它只是抛出一个错误,然后继续执行下一个命令。一旦到达COMMIT命令,事务将被提交,sans重复键导致命令。
这是预期的行为吗?如果是这样,如何设置它,以便在发生此类错误时回滚事务而不是提交事务?
测试环境:
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的记录
发布于 2010-07-23 01:44:15
如果发生错误,MySql (和其他sql engine AFAIK)不会自动回滚事务。
您必须声明一个将回滚事务的错误处理程序:
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND
BEGIN
ROLLBACK;
CALL ERROR_ROLLBACK_OCCURRED;
END;发布于 2009-10-27 21:15:53
如果由于重复而导致insert失败,则数据库将事务回滚到该语句的开头。
它使用在语句开头创建的内部保存点,然后回滚到该保存点。
它不会回滚整个事务,因为这可能不是您想要的。
mysql客户端的行为可以使用命令行参数进行配置。它可以退出(这将隐式回滚)或继续。
如果你使用的是你自己的应用程序,它会做什么取决于你。
Mysql不会对您如何处理故障强加策略-它将其留给您的应用程序。因此,你如何处理它们是你自己的事情--如果你愿意,你可以忽略它们。
https://stackoverflow.com/questions/1630400
复制相似问题