2009-10-27 27 views
9

在mysql innodb事务中,我期望重复键错误导致回滚。它不会,它只是抛出一个错误,并继续到下一个命令。一旦COMMIT命令到达,事务将被提交,sans重复键导致命令。重复密钥错误不取消/回滚mysql事务

这是预期的行为?如果是这样,那么如何设置它,以便在出现这样的错误时事务被回滚而不是提交?

测试环境:

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

+0

参见:http://dev.mysql.com/doc/refman/5.0/en/innodb-error-handling。 html – 2013-06-11 20:23:48

回答

3

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

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

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND 
BEGIN 
    ROLLBACK; 
    CALL ERROR_ROLLBACK_OCCURRED; 
END; 
8

一个记录如果插入失败,因为副本中,数据库将事务回滚到到该语句的开头

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

它不回滚整个交易,因为这可能不是你想要的。

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

如果您使用自己的应用程序,它所做的是由您决定的。


Mysql不会对您如何处理失败施加POLICY - 它会让您的应用程序失效。所以你对他们做的是你自己的事情 - 如果你喜欢,你可以忽略它们。

+2

我想给你100个rep点,因为“Mysql不会对你处理失败施加POLICY - 它会让你的应用程序失效,所以你对它们做的是你自己的业务 - 如果你喜欢,你可以忽略它们“。 – longneck 2009-10-27 18:16:35

+0

那么有没有办法设置一个事务,以便自动回滚重复键错误?还是必须监视每个查询的结果,然后显式回滚以获取此行为? – allixsenos 2009-10-28 09:37:33