我正在尝试在测试中重新创建竞争条件,因此我可以尝试一些解决方案。我发现在我在测试中创建的线程中,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`
知道这里发生了什么吗?
答案 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