3

简洁版本

在控制器操作期间,类变量是线程安全的吗?

长版

我正在编写一个 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 中一般并发问题的好资料是什么?

4

1 回答 1

1

这不是持续时间的问题,并且控制器没有什么特别之处可以使其成为原子(不可中断)代码序列。线程安全是关于理解锁、同步和线程调度程序。

在这种情况下,我认为您的问题甚至不是特定于 Rails 的。一般来说,线程安全是通过在写入发生时锁定数据并在写入完成时解锁数据来实现的。如果您熟悉这些,它与数据库锁定机制非常相似。

对于专注于 Ruby 的良好参考,我会去这里:http ://www.rubycentral.com/pickaxe/tut_threads.html

For more info about the concept the thread safety (threads run at the OS level, after all, so it's more about understanding how thread safety works in any program), I would go here: http://en.wikipedia.org/wiki/Thread_safety

于 2011-10-07T02:31:51.923 回答