什么被认为是“最佳做法”或者什么应该包含在交易区块中的一般经验法则?
主要是当你要对一系列事物进行操作时,如果出现问题你想要回滚吗?类似的东西:
class User < ActiveRecord::Base
def mark_all_posts_as_read!
transaction do
posts.find_each { |p| p.update_attribute(:read, true) }
end
end
end
是否有其他情况可以在交易中执行事情?
答案 0 :(得分:1)
我不确定它是否适用于事务:通常,如果一个对象的状态取决于另一个对象的状态,我只会在模型中使用事务。如果任何一个对象的状态不正确,那么我不想要提交。
经典的例子当然是银行账户。如果您将资金从一个帐户转移到另一个帐户,则不希望将其添加到接收帐户,保存,然后从发送帐户中扣除。如果出现任何问题,那么钱就会消失,你会有一些非常生气的顾客。在一个事务中执行这两个部分可确保在发生错误时,都不会向数据库提交任何内容。
ActiveRecord Transaction Documentation在讨论使用交易的方式和原因方面做得非常出色......如果您想了解更多信息,总会有Wikipedia article。