每当有人将股票添加到他们的投资组合中时,我都会使用activerecord import gem来导入股票价格历史。在添加股票价格历史记录之前,该函数首先检查该股票是否已存在于表中。这样,即使两个人拥有Google股票,也不会两次填充股价历史。
然而,这让我想到了并发添加。如果两个人同时添加Google,而价格历史记录不存在于模型中,则函数“import”将同时出现两次。
这就引出了我的问题。activerecord-import是否锁定该表以同时阻止2个导入?
编辑:根据Jim的建议,我做了以下工作:
在我的股票模型中,我使用一个after_save来运行一个函数,该函数导入到StockHistory中,因此我将StockHistory锁定为:
def populatepricehistory
#columns and prices defined here
StockHistory.transaction do
StockHistory.lock
StockHistory.import columns,prices
end发布于 2013-03-25 04:26:13
activerecord-import本身不会进行任何显式锁定。如果您正在使用并发性做任何事情,那么最好显式地将其隔离。将您的更新包装在ActiveRecord transaction中。您还可以更明确地使用ActiveRecord的pessimistic locking机制进行锁定,但在大多数情况下这并不是必需的;通常更好的做法是让其中一个事务失败,然后由它来处理失败。
在事务中封装很容易:
# 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数组。
请查看上面的两个链接以了解详细信息。
https://stackoverflow.com/questions/15603454
复制相似问题