简洁版本
在控制器操作期间,类变量是线程安全的吗?
长版
我正在编写一个 Rails 3 应用程序,该应用程序使用单个数据库模式实现多租户tenant_id
,每个表中都有列来识别数据属于谁。
自然,我需要一种方法来确定在数据库上运行的所有查询的范围,以确保对每个租户的数据访问正确隔离。
一些人建议通过始终通过tenant
实例访问数据库来实现这一点,例如:
current_tenant.associate_collection.where(...)
等等
但是,由于多租户是一个架构问题(而不是业务领域问题),我希望通过在全局范围内设置它来尽可能保持模型对模型透明。它也很干燥。
我发现我可以使用多租户 gem和 around_filters 来做到这一点:
class ApplicationController
around_filter do
Multitenant.with_tenant current_tenant
yield
end
end
end
这会操纵default_scope
适当的模型,以便所有数据访问都自动限定在当前租户范围内。
这在开发中效果很好,但我担心线程安全。Multitenant.with_tenant
将引用保留current_tenant
在类变量中。
问题是当控制器操作在堆栈上时,我可以依赖该变量的完整性吗?或者它会被另一个请求破坏吗?
另外,关于 Rails 中一般并发问题的好资料是什么?