主线程和子线程中的查询结果不同

时间:2015-04-21 20:09:13

标签: ruby-on-rails multithreading activerecord

注意:关系:User有很多Devices

在调用下面的方法之前,在Rspec测试中我创建了一个只有1个设备的用户。

def perform_stuff_in_a_thread
  user.devices.where(platform: 0) # <ActiveRecord::AssociationRelation [#<Device id: 286, user_id: 19009, token: "abcd123", platform: 0, created_at: "2015-04-21 19:55:35", updated_at: "2015-04-21 19:55:35">]>
  Thread.new do
    user.devices.where(platform: 0) # <ActiveRecord::AssociationRelation []>
  end
end

ActiveRecord和线程是否缺少任何问题?为什么生成的线程内的查询不能按预期工作?

感谢您的任何建议。

1 个答案:

答案 0 :(得分:1)

Rails为不同的线程提供不同的连接(确切地说,有一个数据库连接池,并且池的任何一个成员一次只能给一个线程。)

我假设您正在使用某些形式的事务来处理规范 - 无论是内置于rspec-rails的支持还是通过database_cleaner。这意味着您创建的设备位于未提交的事务中,默认情况下这意味着其他连接不可见(如果您想了解更多信息,请在事务隔离级别上读取),尤其是你产生的线程。

由于当前版本的rails不会自动检查线程中创建的连接 - 您需要自己执行此操作。 with_connection方法是一种简单的方法。