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"