簡體   English   中英

ActiveRecord :: Base.transaction對多個表的含義

[英]Implication of ActiveRecord::Base.transaction on multiple tables

我很好奇帶有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

筆記:

  1. 可能有超過15,000個更改記錄
  2. 當前有大約24,000個商品記錄
  3. 目前大約有38,000個特質記錄
  4. 當前大約有380,000個TraitValue記錄
  5. 初步測試表明,這是一項非常耗時的任務-以分鍾為單位,而不是以秒為單位。

那么在這種情況下,所有四個表都被鎖定了嗎? 還是僅更改表被鎖定?

如果所有四個表都被鎖定,並且該過程需要幾分鍾的時間才能完成,那么使用事務可能不適合我的情況,因為我不想阻止其他用戶添加/更新Item記錄。

我強烈建議您activerecord-import gem或編寫原始sql查詢

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM