rspec中的多线程ActiveRecord请求

时间:2010-05-15 18:57:29

标签: ruby-on-rails ruby activerecord multithreading rspec

我正在尝试在测试中重新创建竞争条件,因此我可以尝试一些解决方案。我发现在我在测试中创建的线程中,ActiveRecord总是返回0表示计数,nil表示查找。例如,表格中有3行“foos”:

  it "whatever" do
    puts Foo.count
    5.times do
      Thread.new do
        puts Foo.count
      end
    end
  end

将打印

3
0
0
0
0
0

test.log显示预期的查询,预期的6次:

 SELECT count(*) AS count_all FROM `active_agents`

知道这里发生了什么吗?

1 个答案:

答案 0 :(得分:15)

我假设ActiveRecord为每个线程打开一个专用的数据库连接。由于每个RSpec示例都包含在事务中,因此其他线程可能看不到更改。

尝试禁用该规范的事务处理程序。

describe "thread test" do
  self.use_transactional_fixtures = false

  it "whatever" do
    puts Foo.count
    5.times do
      Thread.new do
        puts Foo.count
      end
    end
  end
end