我很好奇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
注意:
所以在这种情况下,所有四个表都被锁定了吗?或者只是更改表被锁定了?
如果所有四个表都被锁定,并且该过程需要几分钟才能完成,那么使用事务可能不适合我的情况,因为我不想阻止其他用户添加/更新项目记录。