【问题标题】:reserve a row for a specific time using ActiveRecord使用 ActiveRecord 为特定时间保留一行
【发布时间】:2011-12-28 07:12:00
【问题描述】:

我希望能够在实际付款之前“预订”一个类似于飞机座位锁定一小段时间的元素。我认为最好的方法是通过数据库,最好是在 ORM 层。

这是一个例子:

ActiveRecord::Base.transaction do
  bar = Bar.find(1, :lock => true)
  # do my stuff
end

不过我需要一个更灵活的解决方案。

这是我想象它在概念上的工作方式:

# action1: 
# put an expiring lock (30s) on an element (don't block unrelated code) 
# other code

# action2 (after payment):
# come back to the locked element to claim ownership of it

更新:尝试在 Rails 中执行此操作的任何人都应首先尝试使用built-in optimistic locking 功能。

【问题讨论】:

    标签: ruby-on-rails activerecord transactions locking


    【解决方案1】:

    添加一个额外的列locked_until - 但要注意并发。我可能会在 db 层上这样做。

    【讨论】:

    • 对,我可以用locked_untillocked_by来区分是谁干的。
    • ActiveRecord 使用数据库进行锁定/事务。这样更好,因为我可以在代码中正确执行,而不必担心不同的数据库/SQL 实现(前提是他们正确执行)。
    • 我过去没有做过太多不同的事情,并使用了locked_by/locked_since列,以及乐观锁定来更新2个锁定列。
    • 你有没有使用 Rails 的内置 lock_version 来做这个?
    【解决方案2】:

    我可以有一个专门用于此目的的单独表,称为potential_owner。它将有一个时间戳,以便人们可以弄清楚时间。基本上它会像这样工作:

    # lock the table
    # check latest record to see if the element is available
    # add a new record or die
    

    这很容易实现,但是锁定不是细粒度的。该表描述了不同元素的潜在所有权,并且一个简单的检查锁定了整个表。在 Tass 的解决方案中,仅锁定特定元素的行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多