代码之家  ›  专栏  ›  技术社区  ›  jeem

rspec中的多线程ActiveRecord请求

  •  6
  • jeem  · 技术社区  · 14 年前

    我试图在测试中重新创建一个竞赛条件,这样我就可以尝试一些解决方案。我发现在我在测试中创建的线程中,ActiveRecord总是为counts返回0,为finds返回nil。例如,表“foos”中有3行:

      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 回复  |  直到 14 年前
        1
  •  17
  •   John Bachir    13 年前

    我假设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