ActiveRecord :: Base.transaction对多个表的影响

时间:2012-09-26 19:00:28

标签: mysql ruby-on-rails activerecord database-performance

我很好奇Rails与MySQL数据库如何处理涉及多个表的事务的表/行锁定。

我遇到需要一次更新多条记录的情况,但我还需要更新几条相关记录。我需要确保所有记录都已更新,如果任何更新失败,则会回滚更改。

我为此考虑了一个ActiveRecord :: Base.transaction块,但是一位同事询问了相关模型上的表锁定。

这是我的代码的一个超级简化示例:

Change.transaction do
  Change.all.each do |change|
    new_item = Item.new
    new_trait = Trait.new
    new_trait_value = TraitValue.new
    new_trait.options << new_trait_value
    new_item.traits << new_trait
    new_trait.save
  end
end

注意:

  1. 可能有超过15,000条更改记录
  2. 目前有大约24,000个项目记录
  3. 目前约有38,000个特质记录
  4. 目前有大约380,000个TraitValue记录
  5. 初步测试表明,这是一项非常漫长的任务 - 以分钟为单位,而不是秒。
  6. 所以在这种情况下,所有四个表都被锁定了吗?或者只是更改表被锁定了?

    如果所有四个表都被锁定,并且该过程需要几分钟才能完成,那么使用事务可能不适合我的情况,因为我不想阻止其他用户添加/更新项目记录。

1 个答案:

答案 0 :(得分:0)

我强烈建议你activerecord-import gem或写一个raw sql queries