【问题标题】:ActiveRecord transaction does not rollbackActiveRecord 事务不回滚
【发布时间】:2012-10-30 21:16:48
【问题描述】:

我是 ActiveRecord 事务的新手。在下面的代码中,第一个 update_attributes 导致警告:无法批量分配受保护的属性:account_type_cdx,这没关系。但令我惊讶的是,下一行 self.update_attributes!(:purchased => true) 被执行并存储在数据库中。我期待它回滚,因为第一个失败了。

我一定是错过了什么…… 有什么提示吗?

def complete_purchase(current_user_id, plan_name)
    Rails.logger.debug "COMPLETE PURCHASE"
    user = User.find(current_user_id)
    ActiveRecord::Base.transaction do
        user.update_attributes!(:account_type_cdx => plan_name.to_sym)
        self.update_attributes!(:purchased => true)
    end
end

我听从了这篇文章的建议:http://markdaggett.com/blog/2011/12/01/transactions-in-rails/

谢谢。

【问题讨论】:

    标签: ruby-on-rails-3 activerecord mass-assignment


    【解决方案1】:

    Rails 忽略那些未在attr_accessible 类调用中明确列出的记录(因此是第一个更新警告)。它不会使交易失败,这就是为什么您要达到(并完成)第二个 update_attributes 的原因!正常。

    【讨论】:

    • 很高兴知道。但是如何捕捉警告并触发回滚呢?我想不出我想要保存部分记录的情况,所以不知道为什么这种行为是常态。
    猜你喜欢
    • 1970-01-01
    • 2016-04-19
    • 2023-04-04
    • 2011-09-19
    • 2012-07-13
    • 2013-12-15
    • 2011-01-26
    • 2017-03-03
    相关资源
    最近更新 更多