Rails中TX的任何原因都不应该有requires_new:true

时间:2013-12-05 20:27:13

标签: rspec ruby-on-rails-4 database-cleaner

与此问题相关:custom transaction doesn't work with database_cleaner in rspec

是否有任何地方不想用requires_new启动TX? (嵌套TX)

ModelObject.transaction(requires_new: true)

如果是这种情况,这应该是默认值。

BTW,这是使用默认事务策略时,当代码的正常执行路径成功时,带回滚的rspec测试将失败的原因。

这是我的DatabaseCleaner设置。运行Rails 4。

RSpec.configure do |config|
  config.add_setting(:seed_tables)
  config.seed_tables = %w(global_options shoot_types)

  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation, except: config.seed_tables)
  end

  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end

  config.before(:each, js: true) do
    DatabaseCleaner.strategy = :truncation, {except: config.seed_tables}
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end

end

1 个答案:

答案 0 :(得分:1)

  

为了获得嵌套事务的ROLLBACK,您可以通过传递requires_new:true来请求实际的子事务。如果出现任何问题,数据库将回滚到子事务的开头而不回滚父事务。如果我们将它添加到上一个示例中:

     

大多数数据库不支持真正的嵌套事务。在撰写本文时,我们所知道的唯一支持真正嵌套事务的数据库是MS-SQL。因此,Active Record通过在MySQL和PostgreSQL上使用保存点来模拟嵌套事务。有关保存点的更多信息,请参阅dev.mysql.com/doc/refman/5.6/en/savepoint.html。

http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html