我试图在测试中重新创建一个竞争条件,所以我可以尝试一些解决方案.我发现在我在测试中创建的线程中,ActiveRecord总是返回0表示计数,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
SELECT count(*) AS count_all FROM `active_agents`
知道这里发生了什么吗?
解决方法
我假设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