首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >activerecord-import gem如何处理并发导入?它会锁定表吗?

activerecord-import gem如何处理并发导入?它会锁定表吗?
EN

Stack Overflow用户
提问于 2013-03-25 04:12:42
回答 1查看 2.3K关注 0票数 0

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

然而,这让我想到了并发添加。如果两个人同时添加Google,而价格历史记录不存在于模型中,则函数“import”将同时出现两次。

这就引出了我的问题。activerecord-import是否锁定该表以同时阻止2个导入?

编辑:根据Jim的建议,我做了以下工作:

在我的股票模型中,我使用一个after_save来运行一个函数,该函数导入到StockHistory中,因此我将StockHistory锁定为:

代码语言:javascript
复制
def populatepricehistory

#columns and prices defined here

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-25 04:26:13

activerecord-import本身不会进行任何显式锁定。如果您正在使用并发性做任何事情,那么最好显式地将其隔离。将您的更新包装在ActiveRecord transaction中。您还可以更明确地使用ActiveRecord的pessimistic locking机制进行锁定,但在大多数情况下这并不是必需的;通常更好的做法是让其中一个事务失败,然后由它来处理失败。

在事务中封装很容易:

代码语言:javascript
复制
# 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数组。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15603454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档