【问题标题】:does ruby on rails automatically lock active record associations when locking the active record?ruby on rails 在锁定活动记录时会自动锁定活动记录关联吗?
【发布时间】:2011-04-16 18:51:07
【问题描述】:

非常基本的问题:

我有一个模型 x,它有_很多个 y,并且模型 y 属于_to x。

如果我锁定了 id 为 x_id 的模型 x 的实例,它是否也会锁定表中模型 y 的关联行,该模型 y 在连接列下具有值 x_id?

还是 ror 锁定只是锁定活动记录而不关心它的关联?

谢谢!

【问题讨论】:

    标签: ruby-on-rails activerecord locking associations


    【解决方案1】:

    据我所知,它不会锁定任何关联。它只是锁定行,而不关心模型关联。

    【讨论】:

      【解决方案2】:

      似乎有two locking strategies in rails,乐观(它实际上并没有锁定行,但 ActiveRecord 为同一行的多次更新引发 ActiveRecord::StaleObjectError [除了第一次更新,它将成功])和悲观(它将FOR UPDATE 附加到select 语句并实际锁定行(假设您的数据库支持锁定)。ActiveRecord Locking documentation I read through 都没有暗示有任何魔法导致/允许关联记录被锁定。

      由于您可以传递自己的锁定子句,我建议您阅读特定数据库如何处理用于悲观锁定的子句 rails (select ... for update) 和您可以传递的其他子句(使用 ActiveRecord#lock!)。

      【讨论】:

      • 所以,假设模型 X 与模型 Y 有一个 has_many 关联。我得到模型 X 的一个实例,x,在共享模式下具有锁定。理想情况下,这不应允许从其他线程对模型进行任何更新。但是由于没有考虑关联,所以另一个线程可以修改 has_many 关联(例如 x.ys
      • @dhruvg 是的,你是对的。如果要锁定 X 对象上的关联,则必须编写一些手动执行的初始化代码并锁定与 X 相关的所有 Y。似乎有很多开销。您确定需要锁定所有这些相关实体吗?也许有一种更优雅的方式来实现你想要的,或者你可以找到一个 gem 来扩展 ActiveRecord 中已经存在的锁定行为,而无需自己编写太多代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多