Rails交易

我正在尝试使用ActiveRecord::Base.transaction 。 我认为使用Rails 1.2.6和mysql 5.0默认情况下回滚不起作用。 更多地玩它我发现在mysql连接中autocommit没有设置为0。

问题:

1)如何禁用所有连接的rails中的自动提交?

2)它是否会对其他不必交易的代码产生负面影响?

如果混合使用需要显式事务的代码和可以依赖自动提交的代码,则可能不应禁用所有连接的自动提交。 你是在正确的轨道上想知道这是否会影响其他代码。 如果您禁用自动提交,但其他代码不知道它必须承诺提交其工作,那么这将是一个问题。 连接关闭时回滚未提交的工作。

您应该知道MySQL的默认存储引擎是MyISAM ,它根本不支持事务。 当您对使用MyISAM的表进行更改时,无论您开始和完成事务的显式请求,以及无论自动提交的状态如何,都会立即有效地提交更改。 因此,除非您使用InnoDB存储引擎(或其他事务安全存储引擎,如BDB )创建表,否则无论如何都无法回滚。

没有必要禁用自动提交模式以在MySQL中使用事务。 只需明确地开始一个交易。 在您提交或回滚该事务之前,以下SQL语句将成为事务的一部分,而不管当前连接上的autocommit值是什么。

http://dev.mysql.com/doc/refman/5.0/en/commit.html说:

使用START TRANSACTION时,自动提交将保持禁用状态,直到您使用COMMIT或ROLLBACK结束事务。 然后,自动提交模式将恢复为先前的状态。

您不必禁用自动提交以使用事务。 当您启动事务时,自动提交设置没有任何区别,您必须显式地执行COMMIT或ROLLBACK。 此外,禁用自动提交将影响您的非事务性代码。

正确答案。 我在交易开始时在我的代码中做了DROP TABLE IF EXISTS。 MySQL似乎在事务中的DROP语句有问题:

http://bugs.mysql.com/bug.php?id=989

有趣的是,我已经猜到了在DROP语句之前发送“SET aucotommit = 0”的问题的正确解决方法。

谢谢您的帮助

并不是说我有任何特定的非事务代码 – 它主要是所有的ActiveRecord对象,如果我的一个方法失败,我只想要回滚行为。

我会探索更多,你似乎是对的 – 我可以在mysql控制台中确认你的答案。 但是在我的Rails应用程序中,我必须执行connection.execute(“set autocommit = 0”)才能使回滚工作。