Поиск…


Вступление

Транзакции ActiveRecord являются защитными блоками, в которых последовательность активных запросов записи является постоянной, если все они могут выполняться как одно атомное действие.

Начало работы с активными транзакциями

Активные транзакции записи могут применяться к классам модели, а также к экземплярам модели, объекты внутри блока транзакций не обязательно должны быть экземплярами одного класса. Это связано с тем, что транзакции - это подключение по каждой базе данных, а не для каждой модели. Например:

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 с помощью bang гарантирует, что транзакция будет автоматически откатываться при возникновении исключения, и после откат управление переходит к блоку аварийного восстановления для исключения. Удостоверьтесь, что вы спасаете исключения, выброшенные из сохранения! в блоке транзакций.

Если вы не хотите использовать 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"


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow