gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:42:02 25 4
gpt4 key购买 nike

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

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

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

这是我的代码的一个 super 精简示例:

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 条 Item 记录
  3. 目前大约有 38,000 条 Trait 记录
  4. 目前大约有 380,000 条 TraitValue 记录
  5. 初步测试表明这是一项运行时间非常长的任务 - 以分钟而不是秒为单位。

那么在这个场景中,是不是所有四个表都被锁定了呢?还是只有 Change 表被锁定?

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

最佳答案

我强烈推荐你activerecord-import gem 或写一个 raw sql queries

关于mysql - ActiveRecord::Base.transaction 对多个表的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12608592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com