我很好奇带有 MySQL 数据库的 Rails 如何处理涉及多个表的事务的表/行锁定。
我有一种情况,我需要一次更新多条记录,但我还必须更新几条相关记录。我需要确保所有记录都已更新,如果任何更新失败,则将回滚更改。
我为此考虑了一个 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
笔记:
- 可能有超过 15,000 条变更记录
- 目前大约有 24,000 个项目记录
- 目前大约有 38,000 条 Trait 记录
- 目前大约有 380,000 条 TraitValue 记录
- 初步测试表明这是一个运行时间很长的任务——以分钟而不是秒为单位。
那么在这种情况下,四个表都被锁定了吗?还是只有更改表被锁定?
如果所有四个表都被锁定,并且该过程需要几分钟才能完成,那么使用事务可能不适合我的情况,因为我不想阻止其他用户添加/更新项目记录。