2012-03-01 57 views
0

什麼被認爲是「最佳實踐」,或什麼時候應該包裹在事務塊中的一般經驗法則?何時應該使用ActiveRecord事務?

它主要就是當你要對事物集合執行操作時,並且如果某些事情中斷,你想要回滾?例如:

class User < ActiveRecord::Base 
    def mark_all_posts_as_read! 
    transaction do 
     posts.find_each { |p| p.update_attribute(:read, true) } 
    end 
    end 
end 

是否有其他情況下在事務內部執行事情會有好處?

回答

1

我不確定這是否適合作爲事務的重要用途:通常,如果一個對象的狀態取決於另一個對象的狀態,我只會在模型中使用事務。如果任何一個對象的狀態都不正確,那麼我不希望承諾任何一個。

典型的例子當然是銀行賬戶。如果您將資金從一個帳戶轉移到另一個帳戶,則不希望將其添加到收款帳戶,保存並從發送帳戶中扣除。如果有任何一部分出現問題,那麼錢就會消失,你會有一些非常生氣的客戶。在一個事務中執行這兩個部分可確保如果發生錯誤,則不會向數據庫提交任何內容。

ActiveRecord Transaction Documentation在討論如何使用交易以及爲什麼使用交易方面做得非常出色......如果您還想了解更多信息,總是會有Wikipedia article

+0

我也使用rake任務中的事務。我從API中批量收集大量數據,然後圍繞「create」任務創建一個事務塊以加速插入......只有一個連接用於插入命令,而不是打開和關閉每個任務的連接。 – ScottJShea 2012-03-01 04:33:38

相關問題