Active Record Transactions 入门

Active Record Transactions 可以应用于 Model 类和 Model 实例,事务块中的对象不必都是同一个类的实例。这是因为事务是按数据库连接,而不是每个模型。例如:

User.transaction do
  account.save!
  profile.save!
  print "All saves success, returning 1"
  return 1
end
rescue_from ActiveRecord::RecordInvalid do |exception|
  print "Exception thrown, transaction rolledback"
  render_error "failure", exception.record.errors.full_messages.to_sentence
end

使用 save with a bang 可确保在抛出异常时自动回滚事务,并且在回滚之后,控制将转到该异常的 rescue 块。确保你拯救了保存中抛出的异常! 在交易阻止中。

如果你不想使用 save!,则可以在保存失败时手动提升 raise ActiveRecord::Rollback。你无需处理此异常。然后它将回滚事务并将控制权交给事务块之后的下一个语句。

   User.transaction do
      if account.save && profile.save
        print "All saves success, returning 1"
        return 1
      else
        raise ActiveRecord::Rollback
      end
    end
    print "Transaction Rolled Back"