0

每当有人将股票添加到他们的投资组合中时,我都会使用 activerecord 导入 gem 来导入股票价格历史。在添加股票价格历史之前,该函数首先检查该股票是否已存在于表中。这样,即使 2 个人拥有 Google 股票,它也不会两次填充股票价格历史记录。

但是,这让我想到了并发添加。如果 2 个人同时添加了 Google,并且模型中尚不存在价格历史记录,则“导入”功能将同时出现两次。

这让我想到了我的问题。activerecord-import 是否会锁定表以防止同时进行 2 个导入?

编辑:根据吉姆的建议,我做了以下事情:

在我的 Stock 模型中,我使用 anafter_save来运行导入 StockHistory 的函数,因此我将 StockHistory 锁定为:

def populatepricehistory

#columns and prices defined here

StockHistory.transaction do
    StockHistory.lock
    StockHistory.import columns,prices
end
4

1 回答 1

1

activerecord-import本身不做任何显式锁定。如果您正在做任何与并发相关的事情,最好明确地隔离事物。将您的更新包装在ActiveRecord 事务中。您还可以更明确地使用 ActiveRecord 的悲观锁定机制进行锁定,但大多数时候这不是必需的;通常最好让其中一个事务失败并处理失败。

包装交易很容易:

# Inside ActiveRecord model Foo:

def some_bulk_update
  foo_records = generate_some_foo_records()
  transaction do
    self.import foo_records
  end
end

在事务之外尽可能多地做以减少冲突的窗口是一个好主意。 generate_some_foo_records()以上只是一个示例,说明如何在事务之前调用方法来构建foo_records要导入的数组。

查看上面的两个链接了解详细信息。

于 2013-03-24T20:26:12.640 回答