我正在尝试使用ActiveRecord::Base.transaction
.我认为使用Rails 1.2.6和mysql 5.0默认情况下回滚不起作用.更多地玩它我发现autocommit
在mysql连接中没有设置为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结束事务.然后,自动提交模式将恢复为先前的状态.