Многопоточные запросы ActiveRecord в rspec - PullRequest
8 голосов
/ 15 мая 2010

Я пытаюсь воссоздать состояние гонки в тесте, поэтому я могу попробовать некоторые решения.Я обнаружил, что в потоках, которые я создаю в своем тесте, ActiveRecord всегда возвращает 0 для счетчиков и ноль для находок.Например, с 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 Ответ

16 голосов
/ 17 мая 2010

Я предполагаю, что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...